asp.net Core verwendet DI, um ein angepasstes Benutzersystem zu implementieren

大家讲道理
Freigeben: 2017-05-28 11:41:33
Original
1925 Leute haben es durchsucht

Vorwort

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.

AspektorientierteProgrammierung(AOP)

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.

Abhängigkeitsinjektion (DI)

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.

Spezifische Methoden

1. Benutzerklasse definieren


1     // 用户类,随便写的2     public class MyUser3     {4         public string Token { get; set; }5         public string UserName { get; set; }6     }
Nach dem Login kopieren

2. Benutzerklasse registrieren

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         }
Nach dem Login kopieren

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 .

3. In Middleware einfügen


 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     }
Nach dem Login kopieren

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


Für den Erhalt von Tokens und die Anzeige von API-Dokumenten ist keine Authentifizierung erforderlich.
 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         }
Nach dem Login kopieren

5. In Filter einfügen


Hier habe ich eine Klasse mit
 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     }
Nach dem Login kopieren
String

-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


TypeFilter wird hier verwendet, um den Filter zu laden, der die Abhängigkeitsinjektion verwendet, und kann Parameter festlegen, wie bei der Filterreihenfolge .
1 [TypeFilter(typeof(NeedAuthAttribute), Arguments = new object[]{ "bbb" }, Order = 1)]2 public class ValuesController : Controller
Nach dem Login kopieren

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


In den Konstruktor des Controllers einfügen, damit wir unsere Anpassung im Aktionsbenutzer des Controllers verwenden können wissen, welcher Benutzer diese Aktion gerade aufruft.
 1     public class ValuesController : Controller 2     { 3         private MyUser _user; 4  5         public ValuesController(MyUser user) 6         { 7             _user = user; 8         } 9         ...10     }
Nach dem Login kopieren

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!

Verwandte Etiketten:
di
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage