Asp.Net Core认证-Jwt-基础篇
一、添加依赖
创建 Core
对应 WebApplication
,选择项目类型为 Web Api
,需要引入 Nuget
包 ,Microsoft.AspNetCore.Authentication.JwtBearer
。
二、添加认证服务
在 ConfigureServices
中添加 AddAuthentication
函数,配置如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
//设置secret
byte[] secret = System.Text.Encoding.UTF8.GetBytes("1234567890123456");
//添加认证服务
services.AddAuthentication(config => {
//设置默认架构
config.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
//添加Jwt自定义配置
.AddJwtBearer(config => {
//设置Token验证参数项
config.TokenValidationParameters = new TokenValidationParameters
{
//认证秘钥
IssuerSigningKey = new SymmetricSecurityKey(secret),
//是否调用对 securityToken 签名的
//Microsoft.IdentityModel.Tokens.SecurityKey 的验证
ValidateIssuerSigningKey = true,
//颁发者
ValidIssuer = "ggcy",
//是否验证颁发者
ValidateIssuer = true,
//受众
ValidAudience = "Audience",
//是否验证受众
ValidateAudience = true,
//是否验证凭证有效时限
ValidateLifetime = true,
ClockSkew = TimeSpan.FromMinutes(5)
};
});
}
上述代码中 TokenValidationParameters
中的认证秘钥 IssuerSigningKey
、颁发者 ValidIssuer
、受众 ValidAudience
中,认证秘钥作为必须验证项,后者两项,理论上也需要进行校验,提高数据到安全性,需要设置对应配置为启用状态。
AddAuthentication
对应源码结构如下:
public static class AuthenticationServiceCollectionExtensions
{
public static AuthenticationBuilder AddAuthentication(this IServiceCollection services)
{
//
}
public static AuthenticationBuilder AddAuthentication(this IServiceCollection services, Action<AuthenticationOptions> configureOptions)
{
//
}
public static AuthenticationBuilder AddAuthentication(this IServiceCollection services, string defaultScheme)
{
//
}
}
三、启用认证中间件
服务中,在介于路由中间件 UseRouting
与节点中间件 UseEndpoints
之间添加认证中间件 UseAuthentication
,结构如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//忽略
app.UseRouting();
//启用认证管道中间件
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
//
});
}
四、添加认证接口
创建简单的获取凭证的 Api
,创建一个控制器 TokenController
,添加内容如下:
[ApiController]
[Route("[controller]")]
public class TokenController : ControllerBase
{
[HttpGet]
public object Get()
{
//秘钥
byte[] secret = System.Text.Encoding.UTF8.GetBytes("1234567890123456");
//生成秘钥
var key = new SymmetricSecurityKey(secret);
//生成数字签名的签名密钥、签名密钥标识符和安全算法
var credential = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
//构建JwtSecurityToken类实例
var token = new JwtSecurityToken(
//添加颁发者
issuer: "ggcy",
//添加受众
audience: "Audience",
//添加其他声明
new List<Claim> {
new Claim(ClaimTypes.Name,"zhangsan"),
new Claim(ClaimTypes.Role,"admin")
},
expires: DateTime.UtcNow.AddMinutes(5)
,signingCredentials:credential);
//签发token
return Ok(new
{
access_token = new JwtSecurityTokenHandler().WriteToken(token)
});
}
}
其中 JwtSecurityToken
函数的参数 issuer
、 audience
服务配置时的对应内容 ValidIssuer
、 ValidIssuer
保持一致。
五、测试效果
运行项目,使用 Postman
请求链接 http://localhost:5000/token
,获取结果如下:
将获取到的 access_token
本地保留,请求获取 http://localhost:5000/weatherforecast
,链接数据时,在Auth
页签中,选择添加类型为 Bearer Token
类型的认证方式,填入对应 access_token
,内容如下:
1、请求结果
1)成功
请求成功时,能够获取到对应的 api
请求结果,返回如下结果:
2)错误
当带有的 token
无效或者验证不通过时,响应结果常常是 401Unauthorized
,具体反馈错误内容,从实际请求响应结果中进行查看。具体常见内容如下:
token
过期
HTTP/1.1 401 Unauthorized
Date: Wed, 08 Sep 2021 15:16:10 GMT
Server: Kestrel
Content-Length: 0
WWW-Authenticate: Bearer error="invalid_token", error_description="The token expired at '09/08/2021 15:06:28'"
token
不合法
HTTP/1.1 401 Unauthorized
Date: Wed, 08 Sep 2021 14:59:02 GMT
Server: Kestrel
Content-Length: 0
WWW-Authenticate: Bearer error="invalid_token", error_description="The signature is invalid"
issuer
或 aduenice
内容与服务配置不匹配
HTTP/1.1 401 Unauthorized
Date: Wed, 08 Sep 2021 15:02:30 GMT
Server: Kestrel
Content-Length: 0
WWW-Authenticate: Bearer error="invalid_token", error_description="The issuer 'xxx' is invalid"
HTTP/1.1 401 Unauthorized
Date: Wed, 08 Sep 2021 15:04:28 GMT
Server: Kestrel
Content-Length: 0
WWW-Authenticate: Bearer error="invalid_token", error_description="The audience 'xxx' is invalid"
以上为 Asp.Net Core
使用 Jwt
基本操作和常见细节问题。
六、参考链接
[1] Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step
https://www.cnblogs.com/ittranslator/p/asp-net-core-5-rest-api-authentication-with-jwt-step-by-step.html