ASP.NET Core 授权二(自定义token)
|
TokenAuthenticationHandler.cs
首先自定义一个类TokenAuthenticationHandler,然后需要继承IAuthenticationHandler接口
具体代码:- public class TokenAuthenticationHandler : IAuthenticationHandler
- {
- private AuthenticationScheme _scheme;
- private HttpContext _context;
- /// <summary>
- /// 鉴权初始化
- /// </summary>
- /// <param name="scheme">鉴权架构名称</param>
- /// <param name="context">HttpContext</param>
- /// <returns></returns>
- /// <exception cref="NotImplementedException"></exception>
- public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context)
- {
- _scheme = scheme;
- _context = context;
- return Task.CompletedTask;
- }
- public Task<AuthenticateResult> AuthenticateAsync()
- {
- string token = _context.Request.Headers["Authorization"];
- if (token == "test")
- {
- ClaimsIdentity identity = new ClaimsIdentity("Ctm");
- identity.AddClaims(new List<Claim>(){
- new Claim(ClaimTypes.Name,"admin"),
- new Claim(ClaimTypes.NameIdentifier,"1")
- });
- var claimsPrincipal = new ClaimsPrincipal(identity);
- return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(claimsPrincipal, null, _scheme.Name)));
- }
- return Task.FromResult(AuthenticateResult.Fail("token错误,请重新登录"));
- }
- /// <summary>
- /// 未登录
- /// </summary>
- /// <param name="properties"></param>
- /// <returns></returns>
- /// <exception cref="NotImplementedException"></exception>
- public Task ChallengeAsync(AuthenticationProperties? properties)
- {
- _context.Response.Redirect("/api/Login/NoLogin");
- return Task.CompletedTask;
- }
- /// <summary>
- /// 没有权限访问
- /// </summary>
- /// <param name="properties"></param>
- /// <returns></returns>
- /// <exception cref="NotImplementedException"></exception>
- public Task ForbidAsync(AuthenticationProperties? properties)
- {
- _context.Response.StatusCode = 403;
- return Task.CompletedTask;
- }
- }
复制代码 Program.cs
- #region 自定义Token验证
- builder.Services.AddAuthentication(option =>
- {
- //把自定义的鉴权方案添加到鉴权架构中
- option.AddScheme<TokenAuthenticationHandler>("token","myToken");
- option.DefaultAuthenticateScheme = "token";
- option.DefaultChallengeScheme = "token";
- option.DefaultForbidScheme = "token";
- });
- #endregion
复制代码 请求
后续需要鉴权的接口,在请求上都需要加上Authorization参数
重要类型
Claim:相当于一个身份单元,存储着键值信息
ClaimsIdentity:身份证,身份单元的集合(可以理解为身份证上有多个身份单元)
ClaimsPrincipal:身份证的载体,一个人有多重身份,那么会有多个身份证,比如既有身份证又有学生证
AuthenticateResult:认证结果
AuthenticationTicket:表示一个经过认证后颁发的证书
来源:https://www.cnblogs.com/leafroc/Undeclared/17940069
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|
|
|
发表于 2024-1-2 16:26:39
举报
回复
分享
|
|
|
|