Как управлять пользователями (добавлять) для приложения ASP.NET Core 3.1 извне

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

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

A — веб-сайт, доступный в Интернете. Доступ имеют только пользователи с действительной учетной записью пользователя. В приложении А не должно быть возможности зарегистрировать одного пользователя.

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

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

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

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


comment
Итак, похоже, вы хотите указать EF в своем Application B на базу данных ASP.NET Membership Application A? Я полагаю, что в вашем проекте может быть несколько DbContexts и строк подключения.   -  person timur    schedule 19.02.2020
comment
Вы правы в своем предположении. Я имею в виду, что это уже работает, однако я просто не знаю, как мне добавить пароль нового зарегистрированного пользователя, чтобы приложение А могло выполнить аутентификацию.   -  person misanthrop    schedule 20.02.2020


Ответы (2)


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

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

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

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

person schmityv    schedule 10.03.2020

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

Если вы посмотрите, как создаются пароли хранится и verified, вы заметите, что обе операции в конечном итоге полагаются на 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, поэтому хэши, созданные одним приложением, должны быть доступны для чтения другим без дополнительной работы от вашего имени, если PasswordHasherCompatibilityMode и генерирующая ОС такой же.

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

person timur    schedule 21.02.2020
comment
Спасибо Тимур. Награда должна была истечь по тайм-ауту, поэтому я отдал ее вам. Однако я еще не проверил ваш ответ. Тем не менее спасибо за ваши усилия. Я попробую ваши предложения как можно скорее. - person misanthrop; 24.02.2020