无法从securityToken和#x27;发行人';是null或空c#

无法从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

我正在尝试实现JWT令牌身份验证 但在试图提出索赔时,Sprincipal得到了一个例外

无法从securityToken创建声明,“issuer”为null或空

我不明白下面的代码到底出了什么问题

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是任何您不想检查但被迫使用的字符串常量。即使它不会被验证,也必须存在

错误: (您也可以使用此处介绍的解决方法)