Справочная информация: У меня есть пакет служб SSIS, который загружает данные профиля из системы A и создает соответствующие профили и пользователей членства в системе B. Система B использует настраиваемый поставщик членства ASP.NET, который должен иметь возможность расшифровыватьпароли, сгенерированные пакетом служб SSIS.Я создал хранимые процедуры CLR для генерации соли и шифрования, которые будут использоваться пакетом служб SSIS.
Проблема: Чтобы зашифрованные пароли были расшифрованы провайдером членства в ASP.NET, мне нужно установить MachineKey, используемый хранимыми процедурами CLR.Я понятия не имею, как это сделать, или если это вообще возможно.
Я использовал Reflector, чтобы извлечь требуемый код шифрования из библиотеки System.Membership.После небольшого рефакторинга это выглядит так:
private static byte[] PerformEncryption(byte[] input, bool encryptFlag)
{
if (input == null)
return null;
byte[] inputBuf = input;
byte[] outputBuf;
try
{
using (MemoryStream targetStream = new MemoryStream())
using (SymmetricAlgorithm algo = SymmetricAlgorithm.Create())
using (ICryptoTransform cryptoTransform = CreateCryptoTransform(algo, encryptFlag))
using (CryptoStream cryptoStream = new CryptoStream(targetStream, cryptoTransform, CryptoStreamMode.Write))
{
int start = 0;
int length = input.Length;
// Write the input buffer to the cryptoStream passing the byte stream through the cryptoTransform
cryptoStream.Write(inputBuf, start, length);
cryptoStream.FlushFinalBlock();
outputBuf = targetStream.ToArray();
}
}
catch (Exception ex)
{
throw new InvalidOperationException("Unable to " + (encryptFlag ? "en" : "de") + "crypt data. See inner exception for more detail.", ex);
}
return outputBuf;
}
Проблема в том, что SymmetricAlgorithm.Create()
создает симметричный алгоритм по умолчанию с векторами инициализации, как определено в MachineKey.
Любая помощь приветствуется.Также, пожалуйста, дайте мне знать, если есть лучший / другой подход, который может быть проще.
Спасибо.