Ошибка создания токена JTW с использованием ключа безопасности RSA с размером ключа менее 2048 - PullRequest
0 голосов
/ 01 мая 2018

Я сталкиваюсь с исключением при попытке создать токен JWT в приложении C # Web API.

Тестовая среда

Вот код, отвечающий за генерацию ключей RSA:

    public SignatureInformation CreateNewSignatureInformation(int length = 0)
    {
        try
        {
            var signatureInformation = new SignatureInformation();

            var rsaProvider = new RSACryptoServiceProvider(length);

            var publicKey = rsaProvider.ToXmlString(false);
            signatureInformation.Public = publicKey;

            var privateKey = rsaProvider.ToXmlString(true);
            signatureInformation.Private = privateKey;

            return signatureInformation;
        }
        catch (Exception)
        {
            return null;
        }
    }

А вот код, отвечающий за генерацию токена JTW, подписанного парой ключей RSA, сгенерированной с помощью вышеуказанного кода:

    private string GenerateToken(string privateKeyInXml)
    {
        var cryptoServiceProvider = new RSACryptoServiceProvider();
        cryptoServiceProvider.FromXmlString(privateKeyInXml);

        var creds = new SigningCredentials(new RsaSecurityKey(cryptoServiceProvider),
            SecurityAlgorithms.RsaSha256Signature,
            SecurityAlgorithms.Sha256Digest);

        var nbf = DateTime.UtcNow;
        var exp = nbf.AddMinutes(10);
        var jwtToken = new JwtSecurityToken("SAMPLE_ISSUER",
            "SAMPLE_AUDIENCE",
            null, //null is given as claims list in this sample
            nbf,
            exp,
            creds);

        var tokenHandler = new JwtSecurityTokenHandler();
        var token = tokenHandler.WriteToken(jwtToken); //the exception is thrown here
        return token;
    }

Исключительная ситуация типа System.ArgumentOutOfRangeException и сообщение:

"IDX10630: The 'System.IdentityModel.Tokens.RsaSecurityKey' for signing cannot be smaller than '2048' bits.\r\nParameter name: key.KeySize\r\nActual value was 512."

Вопрос

Как сгенерировать токен JWT, используя ключ безопасности RSA с размером ключа менее 2048?

1 Ответ

0 голосов
/ 01 мая 2018

Ограничение на минимальный размер ключа в этом случае контролируется свойством SignatureProviderFactory.MinimumAsymmetricKeySizeInBitsForSigning. К сожалению, существует также «абсолютный» минимум, который контролируется полем только для чтения SignatureProviderFactory.AbsoluteMinimumAsymmetricKeySizeInBitsForSigning, и этот «абсолютный» минимум установлен на 2048.

Вы должны использовать отражение, чтобы изменить значение этого поля только для чтения на желаемое значение. После этого вы можете установить MinimumAsymmetricKeySizeInBitsForSigning на то же значение.

Пример кода:

var absoluteField = typeof(SignatureProviderFactory).GetField(nameof(SignatureProviderFactory.AbsoluteMinimumAsymmetricKeySizeInBitsForSigning), BindingFlags.Public | BindingFlags.Static);
absoluteField.SetValue(null, 512);
SignatureProviderFactory.MinimumAsymmetricKeySizeInBitsForSigning = 512;

После этого ваш код должен нормально работать и принимать любые ассиметричные ключи размером 512 и выше.

...