JwtBearer簡介 首先要搞清楚什麼是JwtBearer,JwtBearer是ASP.NET Core的OAuth 2.0 JWT Bearer身份驗證提供程式。它提供了對JWT令牌進行驗證的功能,然後允許將令牌中包含的聲明(claims)用於用戶身份驗證和授權控制。 Json Web Toke ...
JwtBearer簡介
首先要搞清楚什麼是JwtBearer,JwtBearer是ASP.NET Core的OAuth 2.0 JWT Bearer身份驗證提供程式。它提供了對JWT令牌進行驗證的功能,然後允許將令牌中包含的聲明(claims)用於用戶身份驗證和授權控制。
Json Web Token (JWT)是一種Web標準,用於在不同系統間傳輸數據。JWT是一種可驗證的和安全的方式,用於在各種應用程式之間傳遞信息。JWT具有一定的安全性,因為它是通過密鑰對JWT進行簽名的,以確保意味著不能進行篡改或偽造。
JWT由三個部分組成,分別為:“Header”、“Payload”和“Signature” 。其中,“header”表示JWT的元數據(元信息),用於描述加密信息和演算法;“payload”表示JWT的指令部分,用於承載用戶狀態或授權相關的信息;“signature”表示JWT的簽名信息,用於驗證JWT的有效性。
JwtBearer首先使用“header”中聲明的演算法對JWT進行身份驗證,以確保其未被篡改。然後,它將使用密鑰根據“payload”中的信息生成令牌,以在用戶請求中將其傳遞。
JwtBearer提供了配置選項,以允許您使用自定義的密鑰和演算法生成和驗證JWT令牌。它還允許您配置應用程式特定的聲明,以在用戶的身份驗證和授權管理中使用。
在.NET Core中使用
1)、首先新建一個APS.NET Core項目,然後在項目中添加JwtBearer包,可以用nuget包管理器添加,也可以使用nuget命令添加,命令如下:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
2)新建一個JwtConfig類,用了存儲token相關數據。
public class JwtConfig
{
public string Key { get; set; } //key
public int Expres { get; set; } //過期時間(單位秒)
public string Issuer { get; set; }
public string Audience { get; set; }
}
3)、在appsettings.json中配置jwt密鑰
//配置文件appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
//JWT的配置內容
"JWT": {//key必須有足夠的長度
"Key": "asfasfdflj134aanjkdsjiio1232sdasdfdfkandsf12",
"expres": "3",
"Issuer": "https://localhost:7201",
"Audience": "https://localhost:7201",
}
}
4)在program.cs文件註入JwtBearer
//註入配置類
builder.Services.Configure<JwtConfig>(builder.Configuration.GetSection("JWT"));
5)新建一個類,專門創建token
//依賴註入
private readonly IOptionsSnapshot<JwtConfig> jwtconfig;
public Demo3Controller(IOptionsSnapshot<JwtConfig> jwtconfig)
{
this.jwtconfig = jwtconfig;
}
public string CreateToken()
{
// 創建聲明列表,即 Token 中攜帶的信息
List<Claim> claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, "admin")); // 添加用戶名
claims.Add(new Claim(ClaimTypes.NameIdentifier, "1080")); // 添加用戶 ID
// 設置 Token 的過期時間
DateTime expres = DateTime.Now.AddSeconds(jwtconfig.Value.Expres);
Console.WriteLine($"過期時間{expres}");
// 從配置文件中獲取 JWT 密鑰並轉換為位元組數組
byte[] secbyse = Encoding.UTF8.GetBytes(jwtconfig.Value.Key);
// 創建 SymmetricSecurityKey 對象並使用 HmacSha256 演算法對密鑰進行簽名
var secKey = new SymmetricSecurityKey(secbyse);
var credetials = new SigningCredentials(secKey, SecurityAlgorithms.HmacSha256);
// 創建 JwtSecurityToken 對象並設置聲明、過期時間和簽名信息
var tokenDescriptor = new JwtSecurityToken(claims: claims, expires: expres, signingCredentials: credetials);
// 生成 JWT Token 字元串並返回
string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
return jwt;
}
6)再在program.cs文件中驗證傳入的token,代碼如下:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(opt =>
{
var JwtOtp = builder.Configuration.GetSection("JWT").Get<JwtConfig>();
byte[] keybase = Encoding.UTF8.GetBytes(JwtOtp.Key);
var seckey = new SymmetricSecurityKey(keybase);
opt.TokenValidationParameters = new()
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = seckey,
};
opt.Events = new JwtBearerEvents
{
//許可權驗證失敗後執行
OnChallenge = context =>
{
//終止預設的返回結果
context.HandleResponse();
string token = context.Request.Headers["Authorization"];
var result = JsonConvert.SerializeObject(new { code = 401, message = "登錄過期" });
if (string.IsNullOrEmpty(token))
{
result = JsonConvert.SerializeObject(new { code = 401, message = "token不能為空" });
context.Response.ContentType = "application/json";
//驗證失敗返回401
context.Response.StatusCode = StatusCodes.Status200OK;
context.Response.WriteAsync(result);
return Task.FromResult(result);
}
try
{
JwtSecurityTokenHandler tokenheader = new();
ClaimsPrincipal claimsPrincipal = tokenheader.ValidateToken(token, opt.TokenValidationParameters, out SecurityToken securityToken);
}
catch (SecurityTokenExpiredException)
{
result = JsonConvert.SerializeObject(new { code = 401, message = "登錄已過期" });
context.Response.ContentType = "application/json";
//驗證失敗返回401
context.Response.StatusCode = StatusCodes.Status200OK;
context.Response.WriteAsync(result);
return Task.FromResult(result);
}
catch (Exception ex)
{
Console.WriteLine(ex);
result = JsonConvert.SerializeObject(new { code = 402, message = "token令牌無效" });
context.Response.ContentType = "application/json";
//驗證失敗返回401
context.Response.StatusCode = StatusCodes.Status200OK;
context.Response.WriteAsync(result);
return Task.FromResult(result);
}
context.Response.ContentType = "application/json";
//驗證失敗返回401
context.Response.StatusCode = StatusCodes.Status200OK;
context.Response.WriteAsync(result);
return Task.FromResult(result);
}
};
});
app.UseAuthentication();//.NETCore驗證中間件,必須有。並且在 app.UseAuthorization();之前
7)、在需要許可權的方法或控制器上加上特性[Authorize]
[HttpGet(Name = "GetAuthorize")]
[Authorize]
public IEnumerable<WeatherForecast> Get()
{
//doing
}
這樣就完成了JwtBearer驗證的代碼,具體調用見下文。
調用流程如下:
1)、首先獲得Token
可以通過登錄驗證後生成。如果是介面程式通過介面獲得。
效果如下:
2)、獲取Token後在請求頭添加Authorization驗證,並輸入獲得的Token,需要註意的是Token前面需要加Bearer並添加一個空格。
效果如下:
如果Token為空的效果:
註:在swagger加token需要另外在program.cs配置,代碼如下:
builder.Services.AddSwaggerGen(s =>
{
//添加安全定義
s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "請輸入token,格式為 Bearer xxxxxxxx(註意中間必須有空格)",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
BearerFormat = "JWT",
Scheme = "Bearer"
});
//添加安全要求
s.AddSecurityRequirement(new OpenApiSecurityRequirement {
{
new OpenApiSecurityScheme{
Reference =new OpenApiReference{
Type = ReferenceType.SecurityScheme,
Id ="Bearer"
}
},new string[]{ }
}
});
});
添加好重啟程式後會在swagger的右上方增加如下按鈕,打開按鈕根據提示即可完成添加。
結語
本文介紹了ASP.NET Core如使用JwtBearer,以及JwtBearer生成token驗證的驗證過程。希望對你有所收穫,歡迎留言或吐槽。
來源公眾號:DotNet開發跳槽