Tatsächlich benötigen wir oft nicht das komplexe Benutzersystem, das mit dem asp.net-Kern einhergeht, der auf Rollen basiert. Verschiedene Konzepte, und Sie müssen EF Core verwenden, und in Webanwendungen werden Informationen für die Kommunikation in Cookies gespeichert (ich mag es nicht, sie in Cookies abzulegen, weil ich die Webanwendung einmal ausgeführt habe Safari-Browser auf Mac-Systemen Wenn domänenübergreifende Cookies nicht gesetzt werden können, muss ich eine ganz spezielle Methode verwenden. Denken Sie daran, dass es sich um iframe handelt, was ziemlich mühsam ist, deshalb füge ich es immer noch gerne in den Benutzerdefiniert ein Kopfähm), ich fühle mich von Microsoft entführt, nachdem ich es verwendet habe. Dies ist jedoch eine völlig persönliche Präferenz. Ich habe hier eine andere Möglichkeit angegeben, damit Sie eine weitere Wahl haben.
Ich verwende die Abhängigkeitsinjektion von asp.net Core, um eine Reihe von Benutzerauthentifizierungen und -autorisierungen für mein eigenes System zu definieren. Sie können darauf zurückgreifen, um Ihr eigenes System zu definieren.
Meiner Meinung nach sind Middleware und Filter beide Aspekte im asp.net-Kern kann an diesen beiden Stellen Authentifizierung und Autorisierung platzieren. Ich persönlich bevorzuge es, die Authentifizierung in Middleware zu platzieren, die illegale Angriffe frühzeitig abfangen und zurückweisen kann.
Es gibt drei Arten der Abhängigkeitsinjektion Lebenszyklus
1. Von der Initiierung bis zum Ende derselben Anfrage . (services.AddScoped)
2. Bei jeder Injektion wird es neu erstellt. (services.AddTransient)
3. Singleton, vom Anfang der Anwendung bis zum Ende der Anwendung. (services.AddSingleton)
Meine benutzerdefinierte Benutzerklasse verwendet Services.AddScoped.
1 // 用户类,随便写的2 public class MyUser3 {4 public string Token { get; set; }5 public string UserName { get; set; }6 }
Startup. Die Funktion „ConfigureServices in 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 }
benutzerdefinierte Benutzerklasse wird über „services.AddScoped“ registriert, weil ich möchte, dass sie in derselben Anfrage enthalten ist , Middleware, Filter und Controller verweisen auf dasselbe Objekt .
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 }
Ich habe das gefunden, wenn ich die Schnittstelle/Klasse in Middleware injizieren möchte Auf bereichsbezogene Weise müssen Sie die Klasse/Schnittstelle, die injiziert werden soll, in den -Parameter der Funktion Invoke anstelle von Konstrukt der Middleware-Funktion , ich vermute, das ist auch der Grund, warum Middleware nicht die Basisklasse oder Schnittstelle erbt und Invoke in der Basisklasse oder Schnittstelle definiert Die Parameter dieser Invoke-Klasse oder -Schnittstelle müssen zwangsläufig festgelegt werden, sodass die Abhängigkeitsinjektion nicht einfach ist. 4. Konfigurieren Sie bestimmte Pfade für die Verwendung der Middleware
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 }
5. In Filter einfügen
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 }
-Parametern erstellt, da dies möglicherweise der Fall ist wiederverwendet, z. B. Beschränkung des Zugriffs auf eine bestimmte Schnittstelle nur für einen bestimmten Benutzer. In dieser Zeichenfolge kann die Identifikation eines bestimmten Benutzers gespeichert werden. Filter kann auch Datenbankzugriffsklassen einfügen, sodass wir die entsprechenden Benutzerinformationen über Token in der Datenbank abrufen können.
6. Filter verwenden
1 [TypeFilter(typeof(NeedAuthAttribute), Arguments = new object[]{ "bbb" }, Order = 1)]2 public class ValuesController : Controller
Die standardmäßige Filterreihenfolge ist „Globale Einstellungen->Controller->Aktion“, und die Reihenfolge ist standardmäßig 0. Wir können diese Reihenfolge ändern, indem wir „Reihenfolge“ festlegen.
7. In den Controller einfügen
1 public class ValuesController : Controller 2 { 3 private MyUser _user; 4 5 public ValuesController(MyUser user) 6 { 7 _user = user; 8 } 9 ...10 }
Das obige ist der detaillierte Inhalt vonasp.net Core verwendet DI, um ein angepasstes Benutzersystem zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!