.net core 3.1JWT用户权限认证(二)获取token
直接上案列
引入程序集
第二步 建立token接口,和token实现类
public interface IJwtTokenService
{
//获取token的方法
public string GetToken();
}
public class JwtTokenService : IJwtTokenService
{
private readonly IConfiguration _configuration;
public JwtTokenService(IConfiguration configuration)
{
_configuration = configuration;//获取appsetting专用IConfiguration
}
/// <summary>
/// 获取token的方法
/// </summary>
/// <returns></returns>
public string GetToken()
{
//创建jwt 三个部分 header,payload,signiture
//header:
var signingAlgorithm = SecurityAlgorithms.HmacSha256;//256加密格式
//payload: 可以加很多东西,自定义的都可以 这里用claim
var claims = new[] {
new Claim(JwtRegisteredClaimNames.Sub,"11111111") //键值对的形式
};
//signiture
//获取配置文件的私钥
var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]);
//加密私钥
var signingKey = new SymmetricSecurityKey(secretByte);
//验证私钥
var signingCredentials = new SigningCredentials(signingKey, signingAlgorithm);
//产生token
var token = new JwtSecurityToken(
issuer: _configuration["Authentication:Issuer"],
audience: _configuration["Authentication:Audience"],
claims,
notBefore: DateTime.UtcNow,//发布时间
expires: DateTime.UtcNow.AddMinutes(2),//过期时间,这里是2分钟
signingCredentials//防伪标志
);
//输出token
var tokenStr = new JwtSecurityTokenHandler().WriteToken(token);
return tokenStr;
}
}
配置文件内容
"Authentication": {
"SecretKey": "123456789qwertyuiop",
"Issuer": "qwertyuiop",
"Audience": "qwertyuiop"
}
最后把服务注册到自带的IServiceCollection中
services.AddScoped<IJwtTokenService, JwtTokenService>();
填坑
错误信息:System.ArgumentOutOfRangeException:“IDX10603: Decryption failed. Keys tried: ‘[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]’.
Exceptions caught:
‘[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]’.
token: ‘[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]’ ”
讲道理这个错误信息真的看不懂
为了让错误信息更加的简单明了我们在startup文件中的Configure
中增加
IdentityModelEventSource.ShowPII = true;
再次运行错误信息就变成了
System.ArgumentOutOfRangeException:“IDX10603: Decryption failed. Keys tried: ‘HS256’.
Exceptions caught:
‘128’.
token: ‘96’ ”
问题原因就是:在设置配置文件SecretKey中的值的时候给的太短了,官方要求必须大于等于16个字符
再次运行 成功获取到token
可以把获取刀的token拿到jwt官网去解析。这里就不做了