ASP.NET Core学习之使用JWT认证授权详解
概述
认证授权是很多系统的基本功能,在以前PC的时代,通常是基于cookies-session这样的方式实现认证授权,在那个时候通常系统的用户量都不会很大,所以这种方式也一直很好运行,随着现在都软件用户量越来越大,系统架构也从以前垂直扩展(增加服务器性能)->水平扩展(增加服务器数量)
cookies-session工作方式
客户端提交用户信息->服务器识别用户->服务端保存用户信息->返回session-id客户端->客户端保存session-id->每次请求cookies带上session-id
这种方式也不是不能水平扩展,例如,session复制/第三方保存session(数据库,Redis)
名词解析
认证:识别用户是否合法
授权:赋予用户权限(能访问哪些资源)
鉴权:鉴定权限是否合法
Jwt优势与劣势
优势
无状态
token存储身份验证所有信息,服务端不需要保存用户身份验证信息,减少服务端压力,服务端更容易水平扩展,由于无状态,又会导致它最大缺点,很难注销
2、支持跨域访问
Cookie是不允许垮域访问的,token支持
3、跨语言
基于标准化的JSONWebToken(JWT),不依赖特定某一个语言,例如生成对Token可以对多个语言使用(Net,Java,PHP...)
劣势
1、Token有效性问题
后台很难注销已经发布的Token,通常需要借助第三方储存(数据库/缓存)实现注销,这样就会失去JWT最大的优势
2、占带宽
Token长度(取决存放内容)比session_id大,每次请求多消耗带宽,token只存必要信息,避免token过长
3、需要实现续签
cookies-session通常是框架已经实现续签功能,每次访问把过期时间更新,JWT需要自己实现,参考OAuth2刷新Token机制实现刷新Token
4、消耗更多CPU
每次请求需要对内容解密和验证签名这两步操作,典型用时间换空间
只能根据自身使用场景决定使用哪一种身份验证方案,没有一种方案是通用的,完美的
AspNetCore集成Jwt认证
1、添加包
dotnetaddpackageMicrosoft.AspNetCore.Authentication.JwtBearer
2、添加配置
"JwtOptions":{
"Issuer":"https://localhost:5001",
"Audience":"https://localhost:5001",
"SecurityKey":"1G3l0yYGbOINId3A*ioEi4iyxR7$SPzm"
}
3、JwtBearer扩展(选项)
publicstaticAuthenticationBuilderAddJwtBearer(thisIServiceCollectionservices,ActionconfigureOptions) { if(configureOptions==null)thrownewArgumentNullException(nameof(configureOptions)); varjwtOptions=newJwtOptions() { Issuer="JwtAuthentication", Audience="WilsonPanWebApi", }; //setcustomsoptoins configureOptions(jwtOptions); //updateOptions services.PostConfigure (options=> { options.Issuer=jwtOptions.Issuer; options.Audience=jwtOptions.Audience; options.SecurityKey=jwtOptions.SecurityKey; }); returnservices.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options=> { options.TokenValidationParameters=newTokenValidationParameters() { ValidIssuer=jwtOptions.Issuer, ValidAudience=jwtOptions.Audience, ValidateIssuer=true, ValidateLifetime=true, ValidateIssuerSigningKey=true, IssuerSigningKey=jwtOptions.SymmetricSecurityKey }; }); }
4、ConfigureServices
services.AddJwtBearer(options=>
{
options.Issuer=Configuration.GetValue("JwtOptions:Issuer");
options.Audience=Configuration.GetValue("JwtOptions:Audience");
options.SecurityKey=Configuration.GetValue("JwtOptions:SecurityKey");
});
5、Configure
app.UseAuthentication(); app.UseAuthorization();
6、addAuthorizeController
//defineclaim
varclaims=newClaim[]
{
newClaim(ClaimTypes.Name,username),
newClaim(ClaimTypes.Email,$"{username}@github.com"),
newClaim(ClaimTypes.Role,username=="WilsonPan"?"Admin":"Reader"),
newClaim(ClaimTypes.Hash,JwtHashHelper.GetHashString($"{username}:{password}:{System.DateTime.Now.Ticks}")),
};
//defineJwtSecurityToken
vartoken=newJwtSecurityToken(
issuer:_jwtOptions.Issuer,
audience:_jwtOptions.Audience,
claims:claims,
expires:System.DateTime.Now.AddMinutes(5),
signingCredentials:_jwtOptions.SigningCredentials
);
//generatetoken
varresult=newJwtSecurityTokenHandler().WriteToken(token);
7、Contrller/Action添加认证授权
[ApiController]
[Authorize]
[Route("[controller]")]
publicclassApiController:ControllerBase
{
...
}
[HttpPost]
[Authorize(Roles="Admin")]
publicIActionResultPost()
{
returnOk();
}
RestClient
dotnetrun
1、认证接口
@host=https://localhost:5001
#@nametoken
POST{{host}}/AuthorizeHTTP/1.1
Content-Type:application/x-www-form-urlencoded
#username=Wilson&password=123456
#admin
username=WilsonPan&password=123456
2、需要授权接口
###requiredauthorize
GET{{host}}/apiHTTP/1.1
Authorization:Bearer{{token.response.body.*}}
3、需要管理员角色接口
###requiredauthorize
POST{{host}}/apiHTTP/1.1
Authorization:Bearer{{token.response.body.*}}
示例代码
总结
到此这篇关于ASP.NETCore学习之使用JWT认证授权的文章就介绍到这了,更多相关ASP.NETCore用JWT认证授权内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。