Как внешне управлять (добавлять) пользователями для приложения ASP. NET Core 3.1 - PullRequest
4 голосов
/ 13 февраля 2020

Извините, здесь не будет предоставлен код, потому что я полностью упускаю идею.

Контекст: я разрабатываю два приложения, оба ASP. NET Core 3.1, давайте их вызывать A и B.

A - это веб-сайт, доступный для inte rnet. Только пользователи с действующей учетной записью должны иметь доступ. Не должно быть возможности зарегистрировать одного пользователя в приложении A.

B является внутренним (intr anet) веб-сайтом. (Аутентификация с Active Directory.) Из приложения BI нужно иметь возможность создавать пользователей для приложения A.

Приложение A НИЧЕГО не имеет с Active Directory, я использую обычное встроенное администрирование пользователей ASP. NET core.

Можно ли вводить пользователей в приложение A из приложения B с помощью Entity Framework? Или есть ли лучший подход? Если он работает с Entity Framework, как я смогу получить значение Salt, которое используется приложением A для подсчета паролей?

Для уточнения: у меня нет вопросов об аутентификации или регистрации пользователей для приложения B, все работает.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Вы можете легко создать га sh пароля с помощью следующего метода

public string CreateHash(TUser user, string password)
{
    var hasher = new PasswordHasher<TUser>();

    return (hasher.HashPassword(user, password));
}

Пользовательский объект даже не должен быть тем, из которого вы хотите изменить пароль.

1 голос
/ 21 февраля 2020

Поскольку в комментариях, которые вы упомянули, вы скорее следите за тем, как хранится соль, я предполагаю, что у вас есть EF, указывающий на настройку Application A членской БД, и сосредоточимся на этом бите хеширования. Я предполагаю, что вы используете UserManager для управления своими паролями.

Если вы посмотрите, как пароли хранятся и проверены , вы заметите, что обе операции в конечном итоге полагаются на PasswordHasher делать работу. Это зависимость, внедренная в ваш UserManager инфраструктурой и смотрящая на реализацию:

private static byte[] HashPasswordV3(
      string password,
      RandomNumberGenerator rng,
      KeyDerivationPrf prf,
      int iterCount,
      int saltSize,
      int numBytesRequested)
    {
      byte[] numArray1 = new byte[saltSize];
      rng.GetBytes(numArray1);
      byte[] numArray2 = Microsoft.AspNetCore.Cryptography.KeyDerivation.KeyDerivation.Pbkdf2(password, numArray1, prf, iterCount, numBytesRequested);
      byte[] buffer = new byte[13 + numArray1.Length + numArray2.Length];
      buffer[0] = (byte) 1;

      PasswordHasher<TUser>.WriteNetworkByteOrder(buffer, 1, (uint) prf); // hash type
      PasswordHasher<TUser>.WriteNetworkByteOrder(buffer, 5, (uint) iterCount); // number of iterations
      PasswordHasher<TUser>.WriteNetworkByteOrder(buffer, 9, (uint) saltSize); // salt size (although not configurable in this implementation)
      Buffer.BlockCopy((Array) numArray1, 0, (Array) buffer, 13, numArray1.Length); // salt goes here
      Buffer.BlockCopy((Array) numArray2, 0, (Array) buffer, 13 + saltSize, numArray2.Length); // password hash goes here
      return buffer; // this gets Base64-encoded upstream
    }

кажется, что соль - это просто случайный 16-байтовый массив, который сохраняется вместе с hash, hashing function и number of iterations used, поэтому хэши, созданные одним приложением, должны читаться другим без какой-либо дополнительной работы от вашего имени, если ОС , генерирующая и , одинакова.

Еще одна вещь, на которую следует обратить внимание, поскольку PasswordHasher является зависимой вставкой , вы можете заменить ее собственной реализацией, если это будет необходимо. Будем надеяться, что поиск по PasswordHasher предоставит вам достаточно контекста.

...