사실 asp.net 코어와 함께 제공되는 복잡한 사용자 시스템이 필요하지 않은 경우가 많으므로 역할과 다양한 개념을 기반으로 EF Core를 사용해야 하며 모든 정보는 EF Core에 저장됩니다. 웹 애플리케이션을 cookie에 저장합니다. (저는 쿠키에 넣는 것을 좋아하지 않습니다. 한 번은 Mac 시스템의 Safari 브라우저에서 웹 애플리케이션을 실행했을 때 크로스 도메인 쿠키를 설정할 수 없다는 문제를 겪었기 때문입니다. , 그래서 아주 특별한 방법을 사용해야 했습니다. , iframe이라는 것이 꽤 번거로워서 아직도 맞춤형 header)에 넣는 것을 좋아합니다. 마이크로소프트에게 납치당했습니다. 그러나 이것은 전적으로 개인적인 취향입니다. 원하는 대로 수행할 수 있습니다. 여기서는 한 가지 더 선택할 수 있도록 다른 방법을 제공합니다.
나는 asp.net 코어의 Dependency Insertion을 사용하여 내 시스템에 대한 사용자 인증 및 권한 부여 세트를 정의합니다. 나를 참조하여 자신만의 시스템을 정의할 수 있으며 이는 사용자 시스템에만 국한되지 않습니다.
1 // 用户类,随便写的2 public class MyUser3 {4 public string Token { get; set; }5 public string UserName { get; set; }6 }
ConfigureServices함수를 등록하세요.
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 }
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에 주입해야 한다는 것을 알았습니다. function parameters, 미들웨어가 기본 클래스나 인터페이스를 상속하지 않고 기본 클래스나 인터페이스에 있는 경우 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 문서를 보는 데는 인증이 필요하지 않습니다.
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 }
여기서
string
Filter는 데이터베이스 액세스 클래스를 주입할 수도 있으므로 데이터베이스의 토큰을 통해 해당 사용자 정보를 얻을 수 있습니다.
6. 필터 사용1 [TypeFilter(typeof(NeedAuthAttribute), Arguments = new object[]{ "bbb" }, Order = 1)]2 public class ValuesController : Controller
여기에서는 TypeFilter를 사용하여 종속성 주입을 사용하여 필터를 로드하고 매개변수와 필터 순서를 설정할 수 있습니다.
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 코어는 DI를 사용하여 맞춤형 사용자 시스템을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!