首先引入Microsoft.AspNetCore.Authentication.JwtBearer nuget包
在startup中加入jwt配置。這里ValidIssuer和ValidAudience和secret 最好配置一下,我這里寫死了。
public static void AddSwagger(this IServiceCollection services)
{
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Cabinet.Core.API 接口文檔——Netcore 3.1",
Version = "v1",
Description = "Cabinet.Core.API HTTP API V1",
});
#region Jwt
//開啟權限小鎖
c.OperationFilter<AddResponseHeadersFilter>();
c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
//在header中添加token,傳遞到后台
//Swagger響應頭#
//這里需要Nuget引用Swashbuckle.AspNetCore.Filters,oauth2需要寫死,SecurityRequirementsOperationFilter中默認securitySchemaName = "oauth2";
//未添加該配置時,Bearer一直無法加入到JWT發起的Http請求的頭部,無論怎么請求都會是401;
c.OperationFilter<SecurityRequirementsOperationFilter>();
c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
{
Description = "JWT授權(數據將在請求頭中進行傳遞)直接在下面框中輸入Bearer {token}(注意兩者之間是一個空格) \"",
Name = "Authorization",//jwt默認的參數名稱
In = ParameterLocation.Header,//jwt默認存放Authorization信息的位置(請求頭中)
Type = SecuritySchemeType.ApiKey
});
#endregion
//xml注釋
var basePath = PlatformServices.Default.Application.ApplicationBasePath;
var xmlPath = Path.Combine(basePath, "Cabinet.Core.API.xml");
c.IncludeXmlComments(xmlPath, true);
});
#region 添加驗證服務
// 添加驗證服務
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
o.TokenValidationParameters = new TokenValidationParameters
{
// 是否開啟簽名認證
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("111111111111111111111111111111111111111111111111111")),
// 發行人驗證,這里要和token類中Claim類型的發行人保持一致
ValidateIssuer = true,
ValidIssuer = "API",//發行人
// 接收人驗證
ValidateAudience = true,
ValidAudience = "User",//訂閱人
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
};
});
#endregion
}
再來一個獲取Token的接口
[AllowAnonymous]
[HttpGet,Route("/GetToken")]
public ActionResult<string> GetToken()
{
//DateTime utc = DateTime.UtcNow;
var claims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Jti,"1"),//編號
new Claim(JwtRegisteredClaimNames.Iat, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),//簽發時間
new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),//生效時間
// 過期時間 100秒
new Claim(JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddSeconds(100)).ToUnixTimeSeconds()}"),
new Claim(JwtRegisteredClaimNames.Iss,"API"), // 簽發者
new Claim(JwtRegisteredClaimNames.Aud,"User") // 接收者
};
// 密鑰
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("111111111111111111111111111111111111111111111111111"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var tokenHandler = new JwtSecurityTokenHandler();
JwtSecurityToken jwt = new JwtSecurityToken(
claims: claims,// 聲明的集合
//expires: .AddSeconds(36), // token的有效時間
signingCredentials: creds
);
var handler = new JwtSecurityTokenHandler();
// 生成 jwt字符串
var strJWT = handler.WriteToken(jwt);
return Ok(strJWT);
}
在startup管道中啟用授權app.UseAuthentication();
運行一下,訪問天氣接口,發現訪問不了,因為加了[Authorize]特性后需要認證,如下圖,出現401沒有權限的標志。


訪問swagger主頁出現一個Authorize的標志,點擊可以輸入jwt的驗證字符。

運行獲取weatherforecast接口,運行結果還是401,因為我們在接口添加了【Authorize】后接口需要一個認證

現在去拿一下token,運行GetToken,獲取Token字符串,

將字符串添加到swagger提供的Authorize認證框里面,粘貼token之前要寫上Bearer加一個空格,再粘上token.點擊Authorize,完成。


再次運行獲取天氣接口

