オリジナル:その下にいくつかの方法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の
出典:ジェーンの本が
著者によって著作権で保護されています。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。