Как включить менеджер пользователя в другое приложение для ASP. NET Core 3.1 - PullRequest
1 голос
/ 07 апреля 2020

Я занимаюсь разработкой двух разных приложений, назову их A и B.

  • A - это платформа inte rnet, в которую вы можете войти, только если у вас есть действующая учетная запись пользователя.
  • B - это платформа intr anet, где пользователи могут проходить аутентификацию через Active Directory. Администратор, использующий приложение B, должен иметь возможность создавать новые учетные записи пользователей для приложения A.

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

Все функции, которые я хочу реализовать, могут быть выполнены с помощью UserManager (см. Раздел «Использование другого приложения для добавления пользователей» по следующей ссылке: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-3.1&tabs=visual-studio#disable - регистровая страница ).

На основании этого я реализовал следующий код:

public class ControllerClass : Controller
{
    private readonly HelperClass _helper;
    private readonly UserManager<IdentityUser> _userManager;

    public ControllerClass (UserManager<IdentityUser> userManager)
    {
        _userManager = userManager;
        _helper= new HelperClass (userManager);
    }
}

public class HelperClass 
{
    private readonly DbContext _db;
    private readonly UserManager<IdentityUser> _userManager;

    public HelperClass (UserManager<IdentityUser> userManager)
    {
        _db = new DbContext ();
        _userManager = userManager;
    }

    private async Task<string> EnsureUser(string userName, string userPassword)
    {
        var user = await _userManager.FindByNameAsync(userName);

        if (user == null)
        {
            user = new IdentityUser()
            {
                UserName = userName                    
            };
            await _userManager.CreateAsync(user, userPassword);
        }

        return user.Id;
    }


    internal async void CreateUser(UserVM uvm, int id)
    {
        var userId = await EnsureUser(uvm.userName, uvm.userPassword);

        // TODO ...
    }

}

К сожалению, мне не удалось включить UserManager в мое приложение B. Я получил следующую ошибку об ошибке: «Произошло необработанное исключение при обработке запроса. InvalidOperationException: невозможно разрешить службу для типа« Microsoft.AspNetCore.Identity.UserManager`1 [IdentityUser] »при попытке активировать« ControllerClass ».»

Выполнить у вас есть идея, как я могу добавить UserManager для управления пользователями для другого приложения?

1 Ответ

2 голосов
/ 07 апреля 2020

Ну, указанная ошибка c, которую вы получаете, просто потому, что UserManager<TUser> не зарегистрирован в коллекции сервисов. Чтобы ввести что-нибудь , вы должны сначала зарегистрировать его. В вашем приложении, ориентированном на пользователя, это делает services.AddIdentity(). Однако это намного больше, чем просто регистрация UserManager<TUser>, поэтому вам не нужно просто запускать и добавлять ту же команду во второе приложение.

Вы можете добавить регистрацию для него специально:

services.AddScoped<UserManager<ApplicationUser>>();

Однако на самом деле он имеет массу зависимостей, каждая из которых также должна быть зарегистрирована. Если вы посмотрите на конструктор , то есть семь сервисов, не зарегистрированных прямо из коробки, многие из которых имеют свои собственные деревья зависимостей. Короче говоря, это боль. Здесь также есть вопрос разделения интересов. Для этого потребуется добавить весь слой данных из другого приложения.

Лучше всего просто выставить API в приложении Identity (и, конечно, заблокировать). Таким образом, все логи c работы с пользователями остаются с остальными логи c. Приложение администрирования может затем вызывать API для добавления, обновления, удаления и т. Д. c. пользователи не должны знать, как это происходит на самом деле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...