无法从securityToken和#x27;发行人';是null或空c#
我正在尝试实现JWT令牌身份验证 但在试图提出索赔时,Sprincipal得到了一个例外 无法从securityToken创建声明,“issuer”为null或空 我不明白下面的代码到底出了什么问题无法从securityToken和#x27;发行人';是null或空c#,c#,jwt,C#,Jwt,我正在尝试实现JWT令牌身份验证 但在试图提出索赔时,Sprincipal得到了一个例外 无法从securityToken创建声明,“issuer”为null或空 我不明白下面的代码到底出了什么问题 public static string GenrateToken(string userId, string deviceId) { var time = DateTime.UtcNow; var symmet
public static string GenrateToken(string userId, string deviceId)
{
var time = DateTime.UtcNow;
var symmetricKey = Convert.FromBase64String(Secret);
var tokenHandler = new JwtSecurityTokenHandler();
SecurityKey securityKey = new InMemorySymmetricSecurityKey(symmetricKey);
var now = DateTime.UtcNow;
var expiry = now.AddHours(24);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{new Claim("userId", userId),new Claim("deviceId", deviceId),new Claim("time", time.ToString())}
),
Lifetime = new Lifetime(now, expiry),
SigningCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature, "")
};
var stoken = tokenHandler.CreateToken(tokenDescriptor);
var token = tokenHandler.WriteToken(stoken);
return token;
}
public static ClaimsPrincipal GetPrincipal(string token)
{
try
{
var tokenHandler = new JwtSecurityTokenHandler();
var jwtToken = tokenHandler.ReadToken(token) as JwtSecurityToken;
if (jwtToken == null)
return null;
var symmetricKey = Convert.FromBase64String(Secret);
SecurityKey securityKey = new InMemorySymmetricSecurityKey(symmetricKey);
var validationParameters = new TokenValidationParameters()
{
RequireExpirationTime = true,
ValidateIssuer = false,
ValidateAudience = false,
IssuerSigningKey = securityKey
};
SecurityToken securityToken;
var principal = tokenHandler.ValidateToken(token, validationParameters, out securityToken);
return principal;
}
catch (Exception ex)
{
//should write log
return null;
}
}
当然,稍后再回答op,但以防万一其他ppl也有同样的问题 您正在使用哪个版本的JwtSecurityTokenHandler? 显然,存在一个强制执行颁发者验证的bug,无论您设置: validateisuer=false 它应该在5.0.0版中修复,但还有其他一些突破性的更改,使我与4.x.x版绑定在一起 您的代币有iss申请吗? 如果不是,则添加为:
new Claim("iss", issuerName),
稍后,在验证令牌时设置颁发者:
var validationParameters = new TokenValidationParameters
{
RequireExpirationTime = true,
ValidateIssuer = false,
ValidIssuer = issuerName,
ValidAudience = false,
IssuerSigningKey = securityKey
};
其中issuerName是任何您不想检查但被迫使用的字符串常量。即使它不会被验证,也必须存在
错误:
(您也可以使用此处介绍的解决方法)