Jwt 鉴权
基本:生成一个 Token
var key = "1234567890123456" ;
Claim[ ] claims = new [ ] { new Claim ( "user" , username) } ;
var keyBytes = Encoding. UTF8. GetBytes ( key) ;
var creds = new SigningCredentials ( new SymmetricSecurityKey ( keyBytes) ,
SecurityAlgorithms. HmacSha256 ) ;
var jwtSecurityToken = new JwtSecurityToken (
issuer : "wosperry.com" ,
audience : "wosperry.com" ,
claims : claims,
expires : DateTime. Now. AddMinutes ( 5 ) ,
signingCredentials: creds ) ;
var token = new JwtSecurityTokenHandler ( ) . WriteToken ( jwtSecurityToken) ;
封装
定义 Options
类
public class TokenOptions
{
public string SecretKey { get ; set ; }
public string Issuer { get ; set ; }
public string Audience { get ; set ; }
public int ExpireMinutes { get ; set ; } = 30 ;
}
在 appsettings.json
添加相关的配置
{
"TokenOptions" : {
"SecretKey" : "123456789456789456" ,
"Issuer" : "wosperry.com" ,
"Audience" : "wosperry.com" ,
"ExpireMinutes" : 2
}
}
封装服务
public interface IJwtService
{
Task< string > CreateTokenAsync ( string username) ;
}
public class JwtService : IJwtService
{
public TokenOptions TokenOptions { get ; }
public JwtService ( IOptions< TokenOptions> options)
{
TokenOptions = options. Value;
}
public Task< string > CreateTokenAsync ( string username)
{
Claim[ ] claims = new [ ] { new Claim ( "user" , username) } ;
var keyBytes = Encoding. UTF8. GetBytes ( key) ;
var creds = new SigningCredentials ( new SymmetricSecurityKey ( keyBytes) ,
SecurityAlgorithms. HmacSha256 ) ;
var jwtSecurityToken = new JwtSecurityToken (
issuer : TokenOptions. Issuer,
audience: TokenOptions. Audience,
claims: claims,
expires: DateTime. Now. AddMinutes ( TokenOptions. ExpireMinutes) ,
signingCredentials: creds) ;
var token = new JwtSecurityTokenHandler ( ) . WriteToken ( jwtSecurityToken) ;
return Task. FromResult ( token) ;
}
}
入口配置
var section = builder. Configuration. GetSection ( "TokenOptions" ) ;
var tokenOptions = section. Get < TokenOptions> ( ) ;
builder. Services. AddTransient < IJwtService, JwtService> ( ) ;
builder. Services. Configure < TokenOptions> ( section) ;
builder. Services. AddAuthentication ( JwtBearerDefaults. AuthenticationScheme)
. AddJwtBearer ( options =>
{
options. TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true ,
ValidateAudience = true ,
ValidateLifetime = true ,
ValidateIssuerSigningKey = true ,
ValidAudience = tokenOptions. Audience,
ValidIssuer = tokenOptions. Issuer,
IssuerSigningKey = new SymmetricSecurityKey ( Encoding. UTF8. GetBytes ( tokenOptions. SecretKey) )
} ;
} ) ;
请求管道配置( 注意顺序 !!! )
app. UseAuthentication ( ) ;
app. UseAuthorization ( ) ;
方便 swagger
设置 Header
builder. Services. AddSwaggerGen ( c =>
{
c. SwaggerDoc ( "v1" , new ( ) { Title = "Perry测试用" , Version = "v1" , Description = "Perry测试用\r\nPerry测试用\r\nPerry测试用\r\n" } ) ;
c. AddSecurityDefinition ( "Bearer" , new OpenApiSecurityScheme
{
Description = "JWT Authorization header using the Bearer scheme." ,
Name = "Authorization" ,
In = ParameterLocation. Header,
Scheme = "bearer" ,
Type = SecuritySchemeType. Http,
BearerFormat = "JWT"
} ) ;
c. AddSecurityRequirement ( new OpenApiSecurityRequirement {
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference { Type = ReferenceType. SecurityScheme, Id = "Bearer" }
} ,
new List< string > ( )
} } ) ;
} ) ;
博客园:https://www.cnblogs.com/wosperry/p/net6_jwt.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!