asp.netコアMVC 3.1ソースコード解析(D)

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セット

 

おすすめ

転載: www.cnblogs.com/lanpingwang/p/12642751.html