ToB企服应用市场:ToB评测及商务社交产业平台

标题: Asp.Net Core 6 Cookie 的身份验证策略 [打印本页]

作者: 道家人    时间: 2023-7-27 00:27
标题: Asp.Net Core 6 Cookie 的身份验证策略
参考文献:
http://www.js-code.com/xindejiqiao/xindejiqiao_274882.html
https://www.cnblogs.com/xiaoxiaotank/p/15811749.html
编写代码过程中不理解的代码可参考上面的文献
首先需要配置你的Program.cs,代码如下:
  1. //在ASP.NET Core应用程序中配置依赖注入容器,将 HttpContextAccessor 注册为一个服务
  2.         builder.Services.AddHttpContextAccessor();
  3.         //选择使用那种方式来身份验证(Cookie)
  4.         builder.Services.AddAuthentication(option =>
  5.         {
  6.             option.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; //默认身份验证方案Cookie
  7.             option.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  8.             option.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  9.             option.DefaultForbidScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  10.             option.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  11.         }).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, option =>
  12.         {
  13.             option.LoginPath = "/Login/AdminLoginView";//如果没有找到用户信息---身份验证失败--授权也失败了---就跳转到指定的Action
  14.             option.AccessDeniedPath = "/Login/AdminLoginView";//访问被拒绝就跳转到指定的Action
  15.         });
复制代码
然后开启中间件
  1. // 身份认证中间件
  2. app.UseAuthentication();
  3. app.UseAuthorization();
复制代码
 创建一个AuthenticationMiddleware.cs类
  1. private readonly RequestDelegate _next;
  2.         public AuthenticationMiddleware(RequestDelegate next, IAuthenticationSchemeProvider schemes)
  3.         {
  4.             _next = next;
  5.             Schemes = schemes;
  6.         }
  7.         public IAuthenticationSchemeProvider Schemes { get; set; }
  8.         public async Task Invoke(HttpContext context)
  9.         {
  10.             // 记录原始路径和原始基路径
  11.             context.Features.Set<IAuthenticationFeature>(new AuthenticationFeature
  12.             {
  13.                 OriginalPath = context.Request.Path,
  14.                 OriginalPathBase = context.Request.PathBase
  15.             });
  16.             // 如果有显式指定的身份认证方案,优先处理(这里不用看,直接看下面)
  17.             var handlers = context.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
  18.             foreach (var scheme in await Schemes.GetRequestHandlerSchemesAsync())
  19.             {
  20.                 var handler = await handlers.GetHandlerAsync(context, scheme.Name) as IAuthenticationRequestHandler;
  21.                 if (handler != null && await handler.HandleRequestAsync())
  22.                 {
  23.                     return;
  24.                 }
  25.             }
  26.             // 使用默认的身份认证方案进行认证,并赋值 HttpContext.User
  27.             var defaultAuthenticate = await Schemes.GetDefaultAuthenticateSchemeAsync();
  28.             if (defaultAuthenticate != null)
  29.             {
  30.                 var result = await context.AuthenticateAsync(defaultAuthenticate.Name);
  31.                 if (result?.Principal != null)
  32.                 {
  33.                     context.User = result.Principal;
  34.                 }
  35.             }
  36.             await _next(context);
  37.         }
复制代码
在写登录的地方去使用

  1. /// <summary>
  2.         /// 用户登录
  3.         /// </summary>
  4.         /// <param name="dto"></param>
  5.         /// <returns></returns>
  6.         /// <exception cref="NotImplementedException"></exception>
  7.         public async Task<ResultDto<int>> AdminLogin(LoginDto dto)
  8.         {
  9.             try
  10.             {
  11.                 var model = await _adminRepository.FindAsync(a => a.AdminAccount == dto.LoginName);
  12.                 if (model.AdminAccount == null)
  13.                 {
  14.                     return new ResultDto<int>
  15.                     {
  16.                         code = 0,
  17.                         data = 2,
  18.                         msg = "用户不存在",
  19.                     };
  20.                 }
  21.                 bool isCode = Validate2(dto.Id, dto.ValidateCode);
  22.                 if (!isCode)
  23.                 {
  24.                     return new ResultDto<int>
  25.                     {
  26.                         code = 0,
  27.                         data = 3,
  28.                         msg = "验证码错误"
  29.                     };
  30.                 }
  31.                 if (model.AdminPassword.ToUpper() == dto.LoginPassword.Md5().ToUpper())
  32.                 {
  33.                     var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
  34.                     identity.AddClaims(new[]
  35.                     {
  36.                         new Claim(ClaimTypes.NameIdentifier,model.AdminId.ToString()),//存储登录的角色的AdminId
  37.                         new Claim(ClaimTypes.Name,model.AdminName),//存储登录的角色的AdminName
  38.                     });
  39.                     var principal = new ClaimsPrincipal(identity);
  40.                     // 登录设置项 比如过期时间
  41.                     var properties = new AuthenticationProperties
  42.                     {
  43.                         ExpiresUtc = DateTimeOffset.UtcNow.AddSeconds(60),
  44.                         AllowRefresh = true
  45.                     };
  46.                     await _httpcontext.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, properties);
  47.                     return new ResultDto<int>
  48.                     {
  49.                         code = 0,
  50.                         data = 1,
  51.                         msg = "登陆成功"
  52.                     };
  53.                 }
  54.                 else
  55.                 {
  56.                     return new ResultDto<int>
  57.                     {
  58.                         code = 0,
  59.                         data = 4,
  60.                         msg = "密码错误"
  61.                     };
  62.                 }
  63.             }
  64.             catch (Exception)
  65.             {
  66.                 throw;
  67.             }
  68.         }
复制代码
 最后给你的控制器加上[Authorize]特性就可以了。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4