Использование настраиваемого SignInManager

Я настраиваю личность следующим образом:

services.AddIdentity<IdentityUser, IdentityRole>(
    c =>
    {
        c.Password.RequireDigit = false;
        c.Password.RequiredLength = 8;
        c.Password.RequireLowercase = false;
        c.Password.RequireNonLetterOrDigit = false;
        c.Password.RequireUppercase = false;
    })
    .AddUserManager<CustomUserManager>()
    .AddUserValidator<CustomUserValidator>()
    .AddCustomStores<PrimaryContext>()
    .AddDefaultTokenProviders();

Я хотел бы использовать настраиваемый диспетчер входа, но AddSignInManager метода нет. Я видел, как другие предлагали добавить следующую строку под фрагментом выше:

services.AddScoped<SignInManager<IdentityUser>, CustomSignInManager>();

Однако это вызывает внутреннюю ошибку сервера:

InvalidOperationException: Unable to resolve service for type 'MyProject.Identity.CustomSignInManager' while attempting to activate 'MyProject.Controllers.AccountController'.

Как я могу заставить работать свой персонализированный менеджер входа?


person Liam M    schedule 18.05.2016    source источник


Ответы (2)


Оказалось, что это недоразумение с моей стороны. Вместо следующего в моем контроллере:

public AccountController(CustomUserManager userManager,
    CustomSignInManager signInManager)
{
    UserManager = userManager;
    SignInManager = signInManager;
}

Этот более подробный блок кода, похоже, работает в сочетании с дополнительной строкой, показанной в моем исходном вопросе:

public AccountController(CustomUserManager userManager,
    SignInManager<IdentityUser> signInManager)
{
    if(!(signInManager is CustomSignInManager))
    {
        throw new ArgumentException(
            "signInManager must be an instance of CustomSignInManager");
    }

    UserManager = userManager;
    SignInManager = signInManager as CustomSignInManager;
}

Это не особенно приятно, но работает.

person Liam M    schedule 19.05.2016
comment
Вы должны использовать services.AddScoped<SignInManager<MyUser>, CustomSignInManager>() в методе ConfigureServices вашего startup.cs. - person frostymarvelous; 07.09.2016
comment
@frostymarvelous Я, это не решило проблему. Об этом упоминается в моем первоначальном вопросе и в моем ответе. - person Liam M; 07.09.2016
comment
Типы параметров я не заметил. Я добавляю ответ, объясняющий проблему, даже если вы ее решили. - person frostymarvelous; 07.09.2016
comment
У меня это не работает. Когда я делаю это в своем конструкторе контроллера, мои пользовательские методы SignInManager не работают, вместо этого используются базовые методы, поэтому мой пользовательский SignInManager практически бесполезен. - person nickornotto; 26.09.2018
comment
@nickornotto Я бы хотел помочь тебе, дружище, но этот вопрос настолько старый, что я не знаю, с чего начать :( - person Liam M; 26.09.2018
comment
Решено, ваш код работает. Я просто переопределил неправильный метод SignInManager, поэтому мое расширение не сработало. См. stackoverflow.com/questions/ 52517170 / - person nickornotto; 26.09.2018

Как упоминалось в комментариях, вы должны использовать services.AddScoped<SignInManager<IdentityUser>, CustomSignInManager>();

Даже если менеджеры входа могут быть изменены в контроллерах, это будет рассматриваться как анти-шаблон, поскольку его необходимо будет реализовать в каждом возможном контроллере, где вы будете выполнять вход.

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

person Eric Herlitz    schedule 02.04.2019