Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JwtSecurityTokenHandler不支持EncryptValue处的异常_C#_Asp.net_Authentication_Jenkins_Jwt - Fatal编程技术网

C# JwtSecurityTokenHandler不支持EncryptValue处的异常

C# JwtSecurityTokenHandler不支持EncryptValue处的异常,c#,asp.net,authentication,jenkins,jwt,C#,Asp.net,Authentication,Jenkins,Jwt,我有一个JsonWebTokenFormat类,它创建一个JWT令牌,并用X.509 RSA SSH 256证书对其进行签名 internal class JsonWebTokenFormat : ISecureDataFormat<AuthenticationTicket> { private readonly string _issuer; private readonly ICertificateStore _store; public JsonWeb

我有一个
JsonWebTokenFormat
类,它创建一个JWT令牌,并用X.509 RSA SSH 256证书对其进行签名

internal class JsonWebTokenFormat : ISecureDataFormat<AuthenticationTicket>
{
    private readonly string _issuer;
    private readonly ICertificateStore _store;

    public JsonWebTokenFormat(string issuer, ICertificateStore store)
    {
        _issuer = issuer;
        _store = store;
    }

    public string Protect(AuthenticationTicket data)
    {
        if (data == null)
        {
            throw new ArgumentNullException("data");
        }

        RSA rsaPrivateKey = _store.GetCurrentUserPrivateCertificate(_issuer);

        SigningCredentials signingCredentials = new SigningCredentials(new RsaSecurityKey(rsaPrivateKey), SecurityAlgorithms.RsaSha256Signature, SecurityAlgorithms.Sha256Digest);

        DateTimeOffset? issued = data.Properties.IssuedUtc;
        DateTimeOffset? expires = data.Properties.ExpiresUtc;

        JwtSecurityToken jwtSecurityToken = new JwtSecurityToken(
            issuer: _issuer,
            claims: data.Identity.Claims,
            notBefore: issued.Value.UtcDateTime,
            expires: expires.Value.UtcDateTime,
            signingCredentials: signingCredentials);
        JwtSecurityTokenHandler jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
        string jwtAuthToken = jwtSecurityTokenHandler.WriteToken(jwtSecurityToken);

        return jwtAuthToken;
    }

    public AuthenticationTicket Unprotect(string jwtToken)
    {
        // read the issuer from the token
        JwtSecurityToken jwtSecurityToken = new JwtSecurityToken(jwtToken);
        RSA rsaPublicKey = _store.GetPublicCertificateForClient(jwtSecurityToken.Issuer);

        TokenValidationParameters tokenValidationParams = new TokenValidationParameters
        {
            ValidIssuer = _issuer,
            RequireExpirationTime = true,
            ValidateIssuer = true,
            RequireSignedTokens = true,
            ValidateLifetime = true,
            ValidateAudience = false,
            IssuerSigningKey = new RsaSecurityKey(rsaPublicKey),
            ValidateIssuerSigningKey = true
        };

        JwtSecurityTokenHandler jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
        SecurityToken tempToken;
        ClaimsPrincipal principal = jwtSecurityTokenHandler.ValidateToken(jwtToken, tokenValidationParams, out tempToken);

        AuthenticationTicket authenticationTicket = new AuthenticationTicket(new ClaimsIdentity(principal.Identity), new AuthenticationProperties());

        return authenticationTicket;
    }
}
所以我有一个单元测试来测试这个类,它在我的本地机器(和其他开发人员的本地机器)上运行良好,但在我们的Jenkins构建环境中失败

它失败,但出现以下异常:

Test method AuthCore.Tests.Token.JsonWebTokenFormatTests.EnsureProtectGeneratesCorrectAuthToken threw exception: 
System.NotSupportedException: Method is not supported.
Stack Trace:
    at System.Security.Cryptography.RSA.DecryptValue(Byte[] rgb)
    at System.Security.Cryptography.RSAPKCS1SignatureFormatter.CreateSignature(Byte[] rgbHash)
    at System.IdentityModel.Tokens.AsymmetricSignatureProvider.Sign(Byte[] input) in c:\workspace\WilsonForDotNet45Release\src\System.IdentityModel.Tokens.Jwt\AsymmetricSignatureProvider.cs:line 224
    at System.IdentityModel.Tokens.JwtSecurityTokenHandler.CreateSignature(String inputString, SecurityKey key, String algorithm, SignatureProvider signatureProvider) in c:\workspace\WilsonForDotNet45Release\src\System.IdentityModel.Tokens.Jwt\JwtSecurityTokenHandler.cs:line 854
    at System.IdentityModel.Tokens.JwtSecurityTokenHandler.WriteToken(SecurityToken token) in c:\workspace\WilsonForDotNet45Release\src\System.IdentityModel.Tokens.Jwt\JwtSecurityTokenHandler.cs:line 815
    at AuthCore.Token.JsonWebTokenFormat.Protect(AuthenticationTicket data) in C:\Jenkins\workspace\AuthCore\Token\JsonWebTokenFormat.cs:line 38
    at AuthCore.Tests.Token.JsonWebTokenFormatTests.EnsureProtectGeneratesCorrectAuthToken() in C:\Jenkins\workspace\AuthCore.Tests\Token\JsonWebTokenFormatTests.cs:line 34
感谢您的帮助。我已经看了很多问题,但没有一个有帮助。

解决了! 问题是自.NET 4.6.0以来,
RsaSecurityKey
类一直被弃用。出于某种原因,此类在未安装较旧版本的.NET的计算机中使用时会引发错误,但在安装较旧版本的.NET的计算机上使用时,该类没有问题。相反,只需使用
X509SecurityKey
class

有关可能的解决方案,请参阅以下文章:


但是您没有提到任何关于构建环境的内容。操作系统、.net版本等。
Test method AuthCore.Tests.Token.JsonWebTokenFormatTests.EnsureProtectGeneratesCorrectAuthToken threw exception: 
System.NotSupportedException: Method is not supported.
Stack Trace:
    at System.Security.Cryptography.RSA.DecryptValue(Byte[] rgb)
    at System.Security.Cryptography.RSAPKCS1SignatureFormatter.CreateSignature(Byte[] rgbHash)
    at System.IdentityModel.Tokens.AsymmetricSignatureProvider.Sign(Byte[] input) in c:\workspace\WilsonForDotNet45Release\src\System.IdentityModel.Tokens.Jwt\AsymmetricSignatureProvider.cs:line 224
    at System.IdentityModel.Tokens.JwtSecurityTokenHandler.CreateSignature(String inputString, SecurityKey key, String algorithm, SignatureProvider signatureProvider) in c:\workspace\WilsonForDotNet45Release\src\System.IdentityModel.Tokens.Jwt\JwtSecurityTokenHandler.cs:line 854
    at System.IdentityModel.Tokens.JwtSecurityTokenHandler.WriteToken(SecurityToken token) in c:\workspace\WilsonForDotNet45Release\src\System.IdentityModel.Tokens.Jwt\JwtSecurityTokenHandler.cs:line 815
    at AuthCore.Token.JsonWebTokenFormat.Protect(AuthenticationTicket data) in C:\Jenkins\workspace\AuthCore\Token\JsonWebTokenFormat.cs:line 38
    at AuthCore.Tests.Token.JsonWebTokenFormatTests.EnsureProtectGeneratesCorrectAuthToken() in C:\Jenkins\workspace\AuthCore.Tests\Token\JsonWebTokenFormatTests.cs:line 34
static string GenerateToken()
{
    var tokenHandler = new JwtSecurityTokenHandler();
    var certificate = new X509Certificate2(@"Test.pfx", "123");
    var securityKey = new X509SecurityKey(certificate);

    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(),
        Issuer = "Self",
        IssuedAt = DateTime.Now,
        Audience = "Others",
        Expires = DateTime.MaxValue,
        SigningCredentials = new SigningCredentials(
            securityKey,
            SecurityAlgorithms.RsaSha256Signature)
    };

    var token = tokenHandler.CreateToken(tokenDescriptor);
    return tokenHandler.WriteToken(token);
}

static bool ValidateToken(string token)
{
    var tokenHandler = new JwtSecurityTokenHandler();
    var certificate = new X509Certificate2(@"Test.cer");
    var securityKey = new X509SecurityKey(certificate);

    var validationParameters = new TokenValidationParameters
    {
        ValidAudience = "Others",
        ValidIssuer = "Self",
        IssuerSigningKey = securityKey
    };

    var principal = tokenHandler.ValidateToken(token, validationParameters, out SecurityToken securityToken);
    if (principal == null)
        return false;
    if (securityToken == null)
        return false;

    return true;
}