AuthorizationApplicationModelProvider
これは、潜在的に許可および認証フィルタを追加しています
最初のFindプロパティは、コントローラとアクションにフィルタリストにAuthorizeFilterを追加し、コントローラとアクションにIAuthorizeDataを達成し、その後、IAuthorizeData AuthorizeFilterに基づいてフィルタを作成します
具体的に個別の承認ロジックの背後を話します
内部 クラスAuthorizationApplicationModelProvider:IApplicationModelProvider { プライベート 読み取り専用MvcOptionsの_mvcOptions。 プライベート 読み取り専用IAuthorizationPolicyProvider _policyProvider。 公共AuthorizationApplicationModelProvider( IAuthorizationPolicyProvider policyProvider、 IOptions <MvcOptions> mvcOptions) { _policyProvider = policyProvider。 _mvcOptions = mvcOptions.Value。 } 公共の int型受注=> - 1000年 +10 ; 公共 のボイドOnProvidersExecuted(ApplicationModelProviderContextコンテキスト) { // 意図的に空にします。 } 公共 ボイドOnProvidersExecuting(ApplicationModelProviderContextコンテキスト) { 場合(コンテキスト== NULL ) { スロー 新しい例外ArgumentNullException(がNameOf(コンテキスト))。 } 場合(_mvcOptions.EnableEndpointRouting) { // エンドポイント・ルーティングを使用する場合、AuthorizationMiddlewareは、認証フィルタがそうでなければ行うであろう作業を行います。 //したがって、我々は、フィルターへの改宗者の許可属性にする必要はありません。 リターン; } foreachの(VARの場合、controllermodel でcontext.Result.Controllers) { VAR controllerModelAuthData = controllerModel.Attributes.OfType <IAuthorizeData> ().ToArray(); もし(controllerModelAuthData.Length> 0 ) { controllerModel.Filters.Add(れるgetFilter(_policyProvider、controllerModelAuthData))。 } foreachの(のvar属性でcontrollerModel.Attributes.OfType <IAllowAnonymous> ()) { controllerModel.Filters.Add(新しいAllowAnonymousFilter())。 } foreachの(VARの actionModel でcontrollerModel.Actions) { VAR actionModelAuthData = actionModel.Attributes.OfType <IAuthorizeData> ().ToArray(); もし(actionModelAuthData.Length> 0 ) { actionModel.Filters.Add(れるgetFilter(_policyProvider、actionModelAuthData))。 } foreachの(VARの属性に actionModel.Attributes.OfType <IAllowAnonymous> ()) { actionModel.Filters.Add(新しいAllowAnonymousFilter())。 } } } } パブリック 静的 AuthorizeFilterれるgetFilter(IAuthorizationPolicyProvider policyProvider、IEnumerableを<IAuthorizeData> authData) { // デフォルトポリシープロバイダは、それが一度だけ行い、所与の入力に対して同じポリシーを行います。 // これは常に同期的に実行されます。 もし(policyProvider.GetType()== typeof演算(DefaultAuthorizationPolicyProvider)) { VARのポリシー= AuthorizationPolicy.CombineAsync(policyProvider、authData).GetAwaiter()のgetResult()。 返す 新しいAuthorizeFilter(ポリシー)。 } 他 { 戻り 新しいAuthorizeFilter(policyProvider、authData)を、 } } }
ApiBehaviorApplicationModelProvider
内部 クラスApiBehaviorApplicationModelProvider:IApplicationModelProvider { 公共ApiBehaviorApplicationModelProvider( IOptions <ApiBehaviorOptions> apiBehaviorOptions、 IModelMetadataProvider modelMetadataProvider、 IClientErrorFactory clientErrorFactory、 ILoggerFactory loggerFactory) { VARのオプション= apiBehaviorOptions.Value。 ActionModelConventions = 新しいリスト<IActionModelConvention> () { 新ApiVisibilityConvention() }。 もし(!options.SuppressMapClientErrors) { ActionModelConventions.Add(新ClientErrorResultFilterConvention()); } もし(!options.SuppressModelStateInvalidFilter) { ActionModelConventions.Add(新しいInvalidModelStateFilterConvention())。 } もし(!のoptions.SuppressConsumesConstraintForFormFileParameters) { ActionModelConventions.Add(新しいConsumesConstraintForFormFileParameterConvention())。 } VARdefaultErrorType = options.SuppressMapClientErrors?typeof演算(無効):typeof演算(ProblemDetails)。 VAR defaultErrorTypeAttributeは= 新しいProducesErrorResponseTypeAttribute(defaultErrorTypeを)。 ActionModelConventions.Add(新しいApiConventionApplicationModelConvention(defaultErrorTypeAttribute)); もし(!options.SuppressInferBindingSourcesForParameters) { ActionModelConventions.Add(新しいInferParameterBindingInfoConvention(modelMetadataProvider)); } } /// <備考> ///注文が実行するように設定された後、<参照CREF =「DefaultApplicationModelProvider」/> や他のユーザーを許可する /// <CREFを参照してください=「IApplicationModelProviderは」/> というconfigureが実行するルーティング。 /// </備考> 公共 int型受注=> - 1000年 + 100 。 公共の一覧<IActionModelConvention> ActionModelConventions { 取得します。} 公共 ボイドOnProvidersExecuted(ApplicationModelProviderContextコンテキスト) { } 公共 ボイドOnProvidersExecuting(ApplicationModelProviderContextコンテキスト) { foreachの(VARのコントローラでcontext.Result.Controllers) { 場合(!IsApiController(コントローラ)) { 続けます。 } foreachの(VARのアクションでcontroller.Actions) { // ApiControllerが正しく設定されていることを確認し EnsureActionIsAttributeRouted(アクション) foreachの(VARの慣例でActionModelConventions) { convention.Apply(アクション) } } } } プライベート 静的 無効EnsureActionIsAttributeRouted(ActionModel actionModel) { 場合(!IsAttributeRouted(actionModel.Controller.Selectors)&& !IsAttributeRouted(actionModel.Selectorsが)) { // ApiControllerAttributeので注釈を付けコントローラとルーティング属性を必要と するvarメッセージ= (Resources.FormatApiController_AttributeRouteRequired actionModel.DisplayName、 がNameOf(ApiControllerAttribute))。 スロー 新しいInvalidOperationExceptionが(メッセージを)。 } ブール値をIsAttributeRouted(のIList <SelectorModel> selectorModel) { ため(varが iは= 0を I ++; I <selectorModel.Count ) { 場合(!selectorModel [i]が.AttributeRouteModel = NULL ) { 戻り 真。 } } を返す 偽。 } } プライベート 静的 ブールIsApiController(場合、controllermodelコントローラ) { 場合(controller.Attributes.OfType <IApiBehaviorMetadata>().ANY()) { 戻り 真。 } VAR controllerAssembly = controller.ControllerType.Assembly。 VAR assemblyAttributes = controllerAssembly.GetCustomAttributes()。 リターン assemblyAttributes.OfType <IApiBehaviorMetadata> ().ANY(); } }
このクラスは、側面が関与WEBAPI
フィルタと関連するプロパティのActionModelセット