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

ASP.NET Core 授权二(自定义token)

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
TokenAuthenticationHandler.cs

首先自定义一个类TokenAuthenticationHandler,然后需要继承IAuthenticationHandler接口
具体代码:
  1. public class TokenAuthenticationHandler : IAuthenticationHandler
  2. {
  3.     private AuthenticationScheme _scheme;
  4.     private HttpContext _context;
  5.     /// <summary>
  6.     /// 鉴权初始化
  7.     /// </summary>
  8.     /// <param name="scheme">鉴权架构名称</param>
  9.     /// <param name="context">HttpContext</param>
  10.     /// <returns></returns>
  11.     /// <exception cref="NotImplementedException"></exception>
  12.     public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context)
  13.     {
  14.         _scheme = scheme;
  15.         _context = context;
  16.         return Task.CompletedTask;
  17.     }
  18.     public Task<AuthenticateResult> AuthenticateAsync()
  19.     {
  20.         string token = _context.Request.Headers["Authorization"];
  21.         if (token == "test")
  22.         {
  23.             ClaimsIdentity identity = new ClaimsIdentity("Ctm");
  24.             identity.AddClaims(new List<Claim>(){
  25.                 new Claim(ClaimTypes.Name,"admin"),
  26.                 new Claim(ClaimTypes.NameIdentifier,"1")
  27.             });
  28.             var claimsPrincipal = new ClaimsPrincipal(identity);
  29.             return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(claimsPrincipal, null, _scheme.Name)));
  30.         }
  31.         return Task.FromResult(AuthenticateResult.Fail("token错误,请重新登录"));
  32.     }
  33.     /// <summary>
  34.     /// 未登录
  35.     /// </summary>
  36.     /// <param name="properties"></param>
  37.     /// <returns></returns>
  38.     /// <exception cref="NotImplementedException"></exception>
  39.     public Task ChallengeAsync(AuthenticationProperties? properties)
  40.     {
  41.         _context.Response.Redirect("/api/Login/NoLogin");
  42.         return Task.CompletedTask;
  43.     }
  44.     /// <summary>
  45.     /// 没有权限访问
  46.     /// </summary>
  47.     /// <param name="properties"></param>
  48.     /// <returns></returns>
  49.     /// <exception cref="NotImplementedException"></exception>
  50.     public Task ForbidAsync(AuthenticationProperties? properties)
  51.     {
  52.         _context.Response.StatusCode = 403;
  53.         return Task.CompletedTask;
  54.     }
  55. }
复制代码
Program.cs
  1. #region  自定义Token验证
  2. builder.Services.AddAuthentication(option =>
  3. {
  4.     //把自定义的鉴权方案添加到鉴权架构中
  5.     option.AddScheme<TokenAuthenticationHandler>("token","myToken");
  6.     option.DefaultAuthenticateScheme = "token";
  7.     option.DefaultChallengeScheme = "token";
  8.     option.DefaultForbidScheme = "token";
  9. });
  10. #endregion
复制代码
请求

后续需要鉴权的接口,在请求上都需要加上Authorization参数
重要类型

Claim:相当于一个身份单元,存储着键值信息
ClaimsIdentity:身份证,身份单元的集合(可以理解为身份证上有多个身份单元)
ClaimsPrincipal:身份证的载体,一个人有多重身份,那么会有多个身份证,比如既有身份证又有学生证
AuthenticateResult:认证结果
AuthenticationTicket:表示一个经过认证后颁发的证书

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

举报 回复 使用道具