翼度科技»论坛 编程开发 .net 查看内容

Asp.Net Core 6 Cookie 的身份验证策略

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
参考文献:
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]特性就可以了。



来源:https://www.cnblogs.com/zkmblog/archive/2023/07/26/17582939.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具