asp.net core は DI を使用してカスタマイズされたユーザー システムを実装します

大家讲道理
リリース: 2017-05-28 11:41:33
オリジナル
1941 人が閲覧しました

前書き

実際、多くの場合、asp.netコアに付属する複雑なユーザーシステムは必要なく、役割とさまざまな概念に基づいてEF Coreを使用する必要があり、すべての情報は. Web アプリケーションを通信用に cookie に保存します (以前、Mac システムの Safari ブラウザーで Web アプリケーションを実行したときに、クロスドメイン Cookie を設定できないことに遭遇したため、Cookie に保存するのは好きではありません)。 、非常に特殊な方法を使用する必要があり、それはかなり面倒なので、私はまだカスタマイズしたヘッドerに入れるのが好きです)を使用した後、感じました。マイクロソフトに誘拐されました。ただし、これは完全に個人的な好みであり、選択肢が 1 つあるように、ここでは別の方法を用意しました。 私は、asp.net core の

Dependency Injection

を使用して、自分のシステムのユーザー認証と認可のセットを定義しています。独自の定義を行う場合は、私を参照してください。これはユーザー システムに限定されません。 アスペクト指向プログラミング

(AOP)

私の意見では、Middl

eware と Filter は両方とも asp.net core のアスペクトであり、これら 2 つの場所に認証と承認を置くことができます。個人的には、不正な攻撃を早期に阻止して返すことができるミドルウェアに認証を組み込むことを好みます。

依存性注入 (DI)

依存性注入には 3 つのタイプがあります

ライフサイクル

1. 同じリクエストの開始から終了まで。 (services.AddScoped)

2. 注入されるたびに新しく作成されます。 (services.AddTransient)

3. シングルトン、アプリケーションの開始から終了まで。 (services.AddSingleton)

私のカスタム ユーザー クラスは services.AddScoped を使用します。

具体的な方法

1. ユーザークラスを定義します

1     // 用户类,随便写的2     public class MyUser3     {4         public string Token { get; set; }5         public string UserName { get; set; }6     }
ログイン後にコピー

2. ユーザークラスを登録します

ConfigureServices

関数をStartup.csに登録します

:

1         // This method gets called by the runtime. Use this method to add services to the container.2         public void ConfigureServices(IServiceCollection services)3         {4             ...5             // 注册自定义用户类6             services.AddScoped(typeof(MyUser));7             ...8         }
ログイン後にコピー

services.AddScopedを使用してユーザークラスをカスタマイズします。なぜなら、同じリクエスト内で、ミドルウェア、フィルター、コントローラー
が同じ

オブジェクト

を参照 することを願っているからです。 3. ミドルウェアに注入する

 1     // You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project 2     public class AuthenticationMiddleware 3     { 4         private readonly RequestDelegate _next; 5         private IOptions<HeaderConfig> _optionsAccessor; 6  7         public AuthenticationMiddleware(RequestDelegate next, IOptions<HeaderConfig> optionsAccessor) 8         { 9             _next = next;10             _optionsAccessor = optionsAccessor;11         }12 13         public async Task Invoke(HttpContext httpContext, MyUser user)14         {15             var token = httpContext.Request.Headers[_optionsAccessor.Value.AuthHeader].FirstOrDefault();16             if (!IsValidate(token))17             {18                 httpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;19                 httpContext.Response.ContentType = "text/plain";20                 await httpContext.Response.WriteAsync("UnAuthentication");21             }22             else23             {24                 // 设置用户的token25                 user.Token = token;26                 await _next(httpContext);27             }28         }29 30         // 随便写的,大家可以加入些加密,解密的来判断合法性,大家自由发挥31         private bool IsValidate(string token)32         {33             return !string.IsNullOrEmpty(token);34         }35     }36 37     // Extension method used to add the middleware to the HTTP request pipeline.38     public static class AuthenticationMiddlewareExtensions39     {40         public static IApplicationBuilder UseAuthenticationMiddleware(this IApplicationBuilder builder)41         {42             return builder.UseMiddleware<AuthenticationMiddleware>();43         }44     }
ログイン後にコピー

スコープモードで
インターフェース

/クラスをミドルウェアに注入したい場合は、注入されるクラス/インターフェースを

Invokeに入れる必要があることがわかりました。ミドルウェアのコンストラクターの代わりに関数パラメータを使用するのは、ミドルウェアが基本クラスまたはインターフェースを継承せず、基本クラスまたはインターフェースにある場合にInvokeを定義しない理由でもあると思います。またはインターフェイスで Invoke を定義すると、この Invoke のパラメータを固定する必要が避けられず、依存関係の注入は容易ではありません。 4. 特定のパスを設定することによってのみ、ミドルウェアが使用されます。

 1         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 2         public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 3         { 4             loggerFactory.AddConsole(Configuration.GetSection("Logging")); 5             loggerFactory.AddDebug(); 6             // Set up nlog 7             loggerFactory.AddNLog(); 8             app.AddNLogWeb(); 9 10             // 除了特殊路径外,都需要加上认证的Middleware11             app.MapWhen(context => !context.Request.Path.StartsWithSegments("/api/token")12                                  && !context.Request.Path.StartsWithSegments("/swagger"), x =>13             {14                 // 使用自定义的Middleware15                 x.UseAuthenticationMiddleware();16                 // 使用通用的Middleware17                 ConfigCommonMiddleware(x);18             });19             // 使用通用的Middleware20             ConfigCommonMiddleware(app);21 22             // Enable middleware to serve generated Swagger as a JSON endpoint.23             app.UseSwagger();24 25             // Enable middleware to serve swagger-ui (HTML, JS, CSS etc.), specifying the Swagger JSON endpoint.26             app.UseSwaggerUI(c =>27             {28                 c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");29             });30         }31 32         // 配置通用的Middleware33         private void ConfigCommonMiddleware(IApplicationBuilder app)34         {35             // cors36             app.UseCors("AllowAll");37 38             app.UseExceptionMiddleware();39             // app.UseLogRequestMiddleware();40             app.UseMvc();41         }
ログイン後にコピー
トークンの取得や API ドキュメントの表示には認証は必要ありません。

5. Filter への挿入


 1     public class NeedAuthAttribute : ActionFilterAttribute 2     { 3         private string _name = string.Empty; 4         private MyUser _user; 5  6         public NeedAuthAttribute(MyUser user, string name = "") 7         { 8             _name = name; 9             _user = user;10         }11 12         public override void OnActionExecuting(ActionExecutingContext context)13         {14             this._user.UserName = "aaa";15         }16     }
ログイン後にコピー
ここでは、この Filter が再利用される可能性があることを考慮して、

string

パラメーターを使用してクラスを作成しました。たとえば、特定のインターフェイスを特定のユーザーのアクセスのみに制限するためです。文字列には、ある種のユーザー ID を格納できます。


Filter はデータベース アクセス クラスを挿入することもできるため、データベース内のトークンを通じて対応するユーザー情報を取得できます。

6. Filter を使用する

1 [TypeFilter(typeof(NeedAuthAttribute), Arguments = new object[]{ "bbb" }, Order = 1)]2 public class ValuesController : Controller
ログイン後にコピー
TypeFilter は、依存関係注入を使用してフィルターをロードするために使用され、フィルターのパラメーターと順序を設定できます。

デフォルトのフィルター順序は、グローバル設定 -> コントローラー -> アクションで、デフォルトでは順序は 0 です。この順序は、順序を設定することで変更できます。


7. コントローラーに注入します

 1     public class ValuesController : Controller 2     { 3         private MyUser _user; 4  5         public ValuesController(MyUser user) 6         { 7             _user = user; 8         } 9         ...10     }
ログイン後にコピー
コントローラーのアクションでカスタム ユーザーを使用し、現在どのユーザーがこのアクションを呼び出しているかを知ることができるように、コントローラーのコンストラクターに注入します。

以上がasp.net core は DI を使用してカスタマイズされたユーザー システムを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
di
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート