Search code examples
c#jwt

JWT error IDX10634: Unable to create the SignatureProvider C#


I'm trying to run my app but it get stuck with the following error:

System.NotSupportedException HResult=0x80131515 Message=IDX10634: Unable to create the SignatureProvider. Algorithm: '[PII is hidden by default. Set the 'ShowPII' flag in IdentityModelEventSource.cs to true to reveal it.]', SecurityKey: '[PII is hidden by default. Set the 'ShowPII' flag in IdentityModelEventSource.cs to true to reveal it.]' is not supported.

Where

Algorithm is RS256

It stucks on executing this instruction: var sectoken = tokenHandler.CreateToken(tokenDescriptor);

What does it mean? What went wrong in my code? How can I solve this?


Here's my code:

using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
//...
public class TokenManager
{
    private string unencoded_key = "CaptainDeadpool";
    private string encoded_key = "CaptainDeadpool";
//...
    public TokenManager()
    {
        var plainTextBytes = Encoding.UTF8.GetBytes(unencoded_key);
        encoded_key = Convert.ToBase64String(plainTextBytes);
    }


    public string CreateFromUsername(string usr, int? timer)
    {
        if (timer == null) {  timer = 30; }
        double timeadd = Convert.ToDouble(timer);

        var secret = Convert.FromBase64String(encoded_key);
        var tokenHandler = new JwtSecurityTokenHandler();

        var actual = DateTime.UtcNow;

        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, usr) }),
            Expires = actual.AddMinutes(timeadd),

            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(secret), SecurityAlgorithms.RsaSha256Signature)
        };

        var sectoken = tokenHandler.CreateToken(tokenDescriptor);
        var stringtoken = tokenHandler.WriteToken(sectoken);

        return stringtoken;
    }
//...

Here's my tokenDescriptor's content while issuing the error:

CONTENT


Solution

  • No idea what that error message means, but it doesn't matter I think, because your code is logically wrong. RSA is assymetric algorithm, but you are trying to use SymmetricSecurityKey with it.

    So either use another (symmetric) signature algorithm (and ensure that your key size is valid for this algorithm), for example:

    // adjust key size
    private string unencoded_key = "CaptainDeadpool!";
    private string encoded_key = "CaptainDeadpool!";
    // ...
    SigningCredentials = new SigningCredentials(
        new SymmetricSecurityKey(secret), 
        SecurityAlgorithms.HmacSha256Signature)
    

    Or provide valid key, for example:

    private readonly RSA _rsa;
    public TokenManager() {
        // import instead of creating new, if necessary
        _rsa = new RSACryptoServiceProvider(2048);            
    }
    // ...
    
    SigningCredentials = new SigningCredentials(
        new RsaSecurityKey(_rsa), 
        SecurityAlgorithms.RsaSha256Signature)