Несколько Redis DataProtection-Ключи хранятся - PullRequest
0 голосов
/ 24 мая 2019

У меня есть основное приложение aspnet, которое использует Data Protection с Redis для сохранения ключей.

Это было добавлено в соответствии с примером, показанным в документации Microsoft: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-storage-providers?view=aspnetcore-2.1&tabs=visual-studio#azure-and-redis

Я создалметод расширения, который вызывает метод PersistKeysToRedis и не передает значение ключа, так как по умолчанию он должен быть «DataProtection-Keys».

public static IDataProtectionBuilder PersistKeysToConfiguredRedis(this IDataProtectionBuilder builder, RedisConnection redisConnection)
{
    redisConnection.ThrowIfNull(nameof(redisConnection));
    var connection = redisConnection.GetConnection();

    if (connection == null)
    {
        // No database configured
        return builder;
    }

    return builder.PersistKeysToRedis(connection);
}

Когда я запускаю несколько экземпляров приложения, которые используют один redisНапример, я получаю следующую ошибку при вызове приложения:

2019-05-24 10:06:22.2339|ERROR|An exception was thrown while deserializing the token.|__id=3c9b1ba6-01f1-43e7-b1d3-e995cf6b1007|__categories=Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery|__source=GV.Platform.IdentityService|EventId=7|EventIdName=<NULL>|ExceptionMessage=The antiforgery token could not be decrypted.|ExceptionDetail=System.InvalidOperationException: The antiforgery token could not be decrypted. ---> System.Security.Cryptography.CryptographicException: The key {ad9b2e25-5a04-4f5e-ba51-72977b6bb561} was not found in the key ring.
at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status)
at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked)
at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] protectedData)
at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)
--- End of inner exception stack trace ---
at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)
at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.GetCookieTokenDoesNotThrow(HttpContext httpContext)|__account=<NULL>|

Не удалось расшифровать маркер защиты от подделки.---> System.Security.Cryptography.CryptographicException: ключ {ad9b2e25-5a04-4f5e-ba51-72977b6bb561} не был найден в кольце для ключей.

Затем я смотрю в redis и ожидаю тамбыть только одним значением, хранящимся в ключе «DataProtection-Keys», но я вижу два:

127.0.0.1:6379> lrange DataProtection-Keys 0 -1
1) "<key id=\"1157f02e-33c2-4a7f-a488-d7fa3ad5befe\" version=\"1\"><creationDate>2019-05-24T09:49:50.4691713Z</creationDate><activationDate>2019-05-24T09:49:50.4167109Z</activationDate><expirationDate>2019-08-22T09:49:50.4167109Z</expirationDate><descriptor deserializerType=\"Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60\"><descriptor><encryption algorithm=\"AES_256_CBC\" /><validation algorithm=\"HMACSHA256\" /><masterKey p4:requiresEncryption=\"true\" xmlns:p4=\"http://schemas.asp.net/2015/03/dataProtection\"><!-- Warning: the key below is in an unencrypted form. --><value>PLsIsUHvPL0uY6lmxenwTDAVUamS9eaqJQyeuRCIB9UqSSaDcAJCjUTSRVp1NKRqnGS0k1U3QPxj8ss7dKo7Zw==</value></masterKey></descriptor></descriptor></key>"
2) "<key id=\"ad9b2e25-5a04-4f5e-ba51-72977b6bb561\" version=\"1\"><creationDate>2019-05-24T09:49:50.5062286Z</creationDate><activationDate>2019-05-24T09:49:50.4478435Z</activationDate><expirationDate>2019-08-22T09:49:50.4478435Z</expirationDate><descriptor deserializerType=\"Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60\"><descriptor><encryption algorithm=\"AES_256_CBC\" /><validation algorithm=\"HMACSHA256\" /><masterKey p4:requiresEncryption=\"true\" xmlns:p4=\"http://schemas.asp.net/2015/03/dataProtection\"><!-- Warning: the key below is in an unencrypted form. --><value>CjJ/6HN8DuU5JxggW46JJWSF82DfINJeUg69fKGC3vyE8hpWuiIxcRdtq97A/NtOBaM43tMvwoZm+VlyLfIlRA==</value></masterKey></descriptor></descriptor></key>"

Это объясняет, почему я вижу ошибку в приложении, когда оно либо получает один, либо другой DataProtection-Keysот редис.Почему это происходит?

...