环境:
Visual Studio 2022 + .NET 7.0
步骤1:
安装:Microsoft.AspNetCore.Authentication.JwtBearer 7.0.9
步骤2:
在appsettings中把秘钥的信息配置加上去。
代码如下:
//秘钥配置
"MyTokenOptions": { //内容随便写都行
"Issuer": "www.abc.com", //授予人
"Audience": "www.abc.com", //接收人
"SecurityKey": "asdfadfasdjflasdflasdjfkl" //密钥
}
步骤3:
在Program中读取配置、并配置鉴权和授权,需要引用包。
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Identity;
using Microsoft.IdentityModel.Tokens;
//读取配置
var Configuration = builder.Configuration;
builder.Services.Configure<MyTokenOptions>(Configuration.GetSection("MyTokenOptions"));
MyTokenOptions tokenOptions = new MyTokenOptions();//初始化
Configuration.Bind("MyTokenOptions", tokenOptions);//实现调用
//鉴权
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
//JWT有一些默认的属性,就是给鉴权时就可以筛选了
ValidateIssuer = false,//是否验证Issuer
ValidateAudience = false,//是否验证Audience
ValidateLifetime = false,//是否雅正失效时间
ValidateIssuerSigningKey = true,//是否验证SecurityKey
ValidAudience = tokenOptions.Audience,
ValidIssuer = tokenOptions.Issuer,//Issuer,这两项喝前面签发jwt的设置一致
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tokenOptions.SecurityKey))
};
});
//授权
builder.Services.AddAuthorization();
步骤4:
在项目中创建一个TokenOptions类:
public class MyTokenOptions
{
/// <summary>
/// 授予人
/// </summary>
public string Audience { get; set; }
/// <summary>
/// 接收人
/// </summary>
public string Issuer { get; set; }
/// <summary>
/// 秘钥
/// </summary>
public string SecurityKey { get; set; }
}
步骤5:
创建一个接口:
public interface IJWTService
{
string GetToken(string name);
}
创建一个类用于封装Token相关的操作:
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace SelfHeating.Tool
{
public class JWTService : IJWTService
{
private MyTokenOptions _JWTTokenOptions = null;
public JWTService(IOptions<MyTokenOptions> options)
{
this._JWTTokenOptions = options.Value;
}
/// <summary>
/// 生成Token就2个步骤:
/// 1 组装信息
/// 2 加密---JWT依赖一系列信息
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public string GetToken(string name)
{
var claims = new[]
{
new Claim("Name", name),
new Claim("id", "11"),
#region 为授权添加
new Claim(ClaimTypes.Name, "ZhangLei"),
new Claim("EMail", "57265177@qq.com"),
//new Claim(ClaimTypes.Email, "xuyang@zhaoxiedu.net"),
//new Claim("Account", "Administrator"),
new Claim("Age", "35"),
new Claim("Mobile", "18664876666"),
new Claim(ClaimTypes.Role,"Admin"),
new Claim("Role", "Assistant"),//这个不能默认角色授权,动态角色授权
new Claim("Sex", "1")//各种信息拼装
#endregion
};
/*
在 ASP.NET Core 中,您可以使用 SymmetricSecurityKey 类来表示对称加密算法的密钥。
对称加密算法使用相同的密钥用于加密和解密数据,因此该密钥必须保密并且仅在通信双方之间共享。
在您提供的代码中,this._JWTTokenOptions.SecurityKey 是用于创建 JWT 签名凭据的密钥字符串。
Encoding.UTF8.GetBytes 方法将该字符串转换为字节数组,然后使用该字节数组创建一个 SymmetricSecurityKey 对象。
在 JWT 身份验证中,该密钥用于加密和解密 JWT 数据。
*/
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(this._JWTTokenOptions.SecurityKey));
/*
在 ASP.NET Core 中,您可以使用 SigningCredentials 类创建用于 JWT(JSON Web Token)身份验证的签名凭据对象。
JWT 是一种开放标准,用于在各种应用程序和服务之间安全地传输信息。JWT 由三部分组成:头部、载荷和签名。
在您提供的代码中,key 是一个 SymmetricSecurityKey 对象,用于存储加密和解密 JWT 数据的密钥值。
SecurityAlgorithms.HmacSha256 表示使用 HMAC-SHA256 算法进行签名。SigningCredentials 类将这些参数组合在一起,
创建用于 JWT 签名的签名凭据对象。
*/
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
/**
* Claims (Payload)
Claims 部分包含了一些跟这个 token 有关的重要信息。 JWT 标准规定了一些字段,下面节选一些字段:
iss: The issuer of the token,token 是给谁的
sub: The subject of the token,token 主题
exp: Expiration Time。 token 过期时间,Unix 时间戳格式
iat: Issued At。 token 创建时间, Unix 时间戳格式
jti: JWT ID。针对当前 token 的唯一标识
除了规定的字段外,可以包含其他任何 JSON 兼容的字段。
* */
var token = new JwtSecurityToken(
issuer: this._JWTTokenOptions.Issuer,
audience: this._JWTTokenOptions.Audience,
claims: claims,
expires: DateTime.Now.AddSeconds(60 * 10),//10分钟有效期
notBefore: DateTime.Now,//立即生效 DateTime.Now.AddMilliseconds(30),//30s后有效
signingCredentials: creds);
string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
return returnToken;
}
}
}
步骤6:
将JwtService服务加入到容器中:
builder.Services.AddSingleton<IJWTService, JWTService>();
配置完成以上步骤咱们就可以测试了。
完整的示例地址: