いくつかの方法で認証下ASP.Netコア - シンプルブック

オリジナル:その下にいくつかの方法ASP.Netコア認証-ブック

いくつかの方法で認証の下でASP.Netコア

 

目標は、認証の認証HTTPリクエストの成功を確認することです。ASP.Netコア認証は、さまざまな方法を提供し、参照とすることができる、Microsoftの公式ドキュメントここでは、次の3つの方法の詳細のみ:

  • ポリシー
  • ミドルウェア
  • カスタム属性

1.ポリシー:ポリシーの認可

IAuthorizationRequirementは、最初次の例では、パラメータの年齢を渡すサポートする、ポリシー要件を定義するクラスを定義します。

    public class AdultPolicyRequirement : IAuthorizationRequirement
    {
        public int Age { get; } public AdultPolicyRequirement(int age) { //年龄限制 this.Age = age; } } 

検証済みかどうかを決定するために、コントローラ記載のHTTPリクエストメッセージを提供するために要求されたときに、ポリシー要件ハンドラを定義します。

    public class AdultAuthorizationHandler : AuthorizationHandler
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AdultPolicyRequirement requirement) { //获取当前http请求的context对象 var mvcContext = context.Resource as AuthorizationFilterContext; //以下代码都不是必须的,只是展示一些使用方法,你可以选择使用 ...... // var age = mvcContext.HttpContext.Request.Query.FirstOrDefault(u => u.Key == "age"); if (age.Value.Count <= 0|| Convert.ToInt16(age.Value[0]) < requirement.Age) { context.Fail(); } else { //通过验证,这句代码必须要有 context.Succeed(requirement); } return Task.CompletedTask; } } 

また、あなたが開始する必要があり、ポリシーで定義されたサービスおよび対応するハンドラに登録

    //添加二种认证策略,一种以12岁为界限,一种是18岁
    services.AddAuthorization(options => { options.AddPolicy("Adult1", policy => policy.Requirements.Add(new AdultPolicyRequirement(12))); options.AddPolicy("Adult2", policy => policy.Requirements.Add(new AdultPolicyRequirement(18))); }); //添加策略验证handler services.AddSingleton(); 

最後に、それぞれのフロントコントローラープラスAuthroize特性[Authorize("Adult1")]全体的にこのように政策は比較的簡単ですが、柔軟な場所が存在しない、異なる戦略がサービスに登録し、事前に必要とされています。完全な例は、参照することができますPolicySampleを

2.ミドルウェア:ミドルウェア方法

特別に許可されていないこのように、それはすべてのHTTPリクエストとレスポンス、データ処理、エラージャンプ、ログ処理の前にチェックを認証するために使用される、より汎用性と、より柔軟です。詳細を参照することができミドルウェアについて説明公式

 
画像

この図は、基本的な構造と動作図は、我々はパイプからなる、より多くの中間コンポーネントを作成し、HTTPリクエストに応答HttpContext.Response HttpContext.Requestの作成前に送られて処理することができます。以下の例を参照して、中間体アセンブリは、2つのカテゴリを定義します。

    public class AuthorizeMiddleware
    {
        private readonly RequestDelegate next;
        public AuthorizeMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context /* other scoped dependencies */) { //以下代码都不是必须的,只是展示一些使用方法,你可以选择使用 ... //这个例子只是修改一下response的header context.Response.OnStarting(state => { var httpContext = (HttpContext)state; httpContext.Response.Headers.Add("test2", "testvalue2"); return Task.FromResult(0); }, context); //处理结束转其它中间组件去处理 await next(context); } } 
    public class OtherMiddleware
    {
        private readonly RequestDelegate next;
        public OtherMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context ) { //这个例子只是修改一下response的header context.Response.OnStarting(state => { var httpContext = (HttpContext)state; httpContext.Response.Headers.Add("test1", "testvalue1" ); return Task.FromResult(0); }, context); await next(context); } } 

ここで定義されたクラスは、インタフェースクラスまたは統合されたシステムを実装していません。ただ、ミドルウェア、プロキシクラスの定義を高めるためにアプリを与えます。注)(はHttpResponse後にコールnext.invokeを発行していません。以下の3つのコード実行順序が間違ってすることはできません。

      app.UseMiddleware(typeof(AuthorizeMiddleware)); app.UseMiddleware(typeof(OtherMiddleware)); app.UseMvc(); 

実行順序のWeb要求を実行した後:

  • 実行のAuthorizeMiddlewareのinvokeメソッド
  • 実行OtherMiddleware invokeメソッド
  • 実行ValueControllerの方法を取得します。
  • 実行のヘッダ方法を変更OtherMiddleware
  • 実行のヘッダ方法を変更AuthorizeMiddleware
  • 発行されたHTTPレスポンス

彼らはそれを理解するための独自のコードを実行することができます。コード参照Githubの住所

3.カスタム属性:カスタムプロパティ

実際には、これは具体的な方法コントローラの位置に異なるパラメータのカスタムポリシーの方針を達成するために、最初の政策方針やカスタム結合特性です。

まず、Attributeクラスとポリシー要件を定義する必要があります

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public class PermissionCheckAttribute : AuthorizeAttribute { public string Id { get; set; } public int Operation { get; set; } public PermissionCheckAttribute() : base("PermissionCheck") { } } public class PermissionCheckPolicyRequirement : IAuthorizationRequirement { //Add any custom requirement properties if you have them public PermissionCheckPolicyRequirement() { } } 

属性定義されたポリシーとそれに対応する処理クラスハンドラ

    public class PermissionCheckPolicyHandler : AttributeAuthorizationHandler<PermissionCheckPolicyRequirement, PermissionCheckAttribute>
    { protected override Task HandleRequirementAsync(AuthorizationHandlerContext authoriazationContext, PermissionCheckPolicyRequirement requirement, IEnumerable<PermissionCheckAttribute> attributes) { var context = authoriazationContext.Resource as AuthorizationFilterContext; foreach (var permissionAttribute in attributes) { this.checkPermission(context, permissionAttribute.Id, permissionAttribute.Operation); } authoriazationContext.Succeed(requirement); return Task.FromResult<object>(null); } private void checkPermission(AuthorizationFilterContext context, string _Id, int _Operation) { if (_Operation > 0) { if (_Id != "user1") { throw new Exception("不具备操作权限"); } } else { //dosomething } return; } } 

同じことがまた、ここでコードが掲載されていない、クラスのサービスを処理する戦略やポリシーを追加する必要があります。最後に、コントローラの属性パラメータを使用して、次のような:

        [HttpGet]
        [PermissionCheck (Id ="user1", Operation=2)] public IEnumerable Get() { return new string[] { "value1", "value2" }; } // GET api/values/5 [HttpGet("{id}")] [PermissionCheck(Id = "user2", Operation = 4)] public string Get(int id) { return "value"; } 

完全なコード参照Githubの住所



著者:voxerの
リンクします。https://www.jianshu.com/p/0ed4d820809cの
出典:ジェーンの本が
著者によって著作権で保護されています。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

おすすめ

転載: www.cnblogs.com/lonelyxmas/p/11888372.html
おすすめ