InMemorySymmetricSecurityKey

InMemorySymmetricSecurityKey

我一直在尝试使用简单的 key 创建并签名JwtSecurityToken。经过大量研究,似乎我发现的所有示例都使用了InMemorySymmetricSecurityKey类,但不幸的是,该类似乎在System.IdentityModel库的最新版本中不存在。

这些是我正在使用的依赖项:

"System.IdentityModel.Tokens": "5.0.0-rc1-211161024",
"System.IdentityModel.Tokens.Jwt": "5.0.0-rc1-211161024"

我也尝试使用它的基类SymmetricSecurityKey,但随后在尝试创建 token 时收到以下异常:
"Value cannot be null.\r\nParameter name: IDX10000: The parameter 'signatureProvider' cannot be a 'null' or an empty object."

这是引发异常的代码:
public static string CreateTokenHMAC()
{
    HMACSHA256 hmac = new HMACSHA256(Convert.FromBase64String("test"));

    var key = new SymmetricSecurityKey(hmac.Key);

    var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature);

    JwtSecurityToken token = _tokenHandler.CreateJwtSecurityToken(new SecurityTokenDescriptor()
    {
        Audience = AUDIENCE,
        Issuer = ISSUER,
        Expires = DateTime.UtcNow.AddHours(6),
        NotBefore = DateTime.Now,
        Claims = new List<Claim>()
        {
            new Claim(ClaimTypes.Email, "[email protected]")
        },
        SigningCredentials = signingCredentials
    });

    return _tokenHandler.WriteToken(token);
}

这是我第一次使用JwtSecurityToken,所以我的猜测是我可能在某处缺少了一步

最佳答案

我设法达到完全相同的异常(exception)。我通过另一种方式生成 key 来解决该问题:

RSAParameters keyParams;
using (var rsa = new RSACryptoServiceProvider(2048))
{
    try
    {
        keyParams = rsa.ExportParameters(true);
    }
    finally
    {
        rsa.PersistKeyInCsp = false;
    }
}
RsaSecurityKey key = new RsaSecurityKey(keyParams);
var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature);

这是token-based authentication on ASP.NET 5 RC1撰写的有关Mark Hughes的精彩文章

关于c# - dnx451 RC1 InMemorySymmetricSecurityKey发生了什么情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35463289/

10-10 04:11