実際、多くの場合、asp.netコアに付属する複雑なユーザーシステムは必要なく、役割とさまざまな概念に基づいてEF Coreを使用する必要があり、すべての情報は. Web アプリケーションを通信用に cookie に保存します (以前、Mac システムの Safari ブラウザーで Web アプリケーションを実行したときに、クロスドメイン Cookie を設定できないことに遭遇したため、Cookie に保存するのは好きではありません)。 、非常に特殊な方法を使用する必要があり、それはかなり面倒なので、私はまだカスタマイズしたヘッドerに入れるのが好きです)を使用した後、感じました。マイクロソフトに誘拐されました。ただし、これは完全に個人的な好みであり、選択肢が 1 つあるように、ここでは別の方法を用意しました。 私は、asp.net core の
Dependency Injectionを使用して、自分のシステムのユーザー認証と認可のセットを定義しています。独自の定義を行う場合は、私を参照してください。これはユーザー システムに限定されません。 アスペクト指向プログラミング
(AOP)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. ユーザークラスを登録します
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 が再利用される可能性があることを考慮して、
Filter はデータベース アクセス クラスを挿入することもできるため、データベース内のトークンを通じて対応するユーザー情報を取得できます。
1 [TypeFilter(typeof(NeedAuthAttribute), Arguments = new object[]{ "bbb" }, Order = 1)]2 public class ValuesController : ControllerTypeFilter は、依存関係注入を使用してフィルターをロードするために使用され、フィルターのパラメーターと順序を設定できます。 デフォルトのフィルター順序は、グローバル設定 -> コントローラー -> アクションで、デフォルトでは順序は 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 サイトの他の関連記事を参照してください。