Создание собственного SignInManager в Asp, Net Core 3 Identity - PullRequest
3 голосов
/ 19 марта 2019

Я хочу создать собственный класс для моего SignInManager, поэтому я создал класс, который наследуется от SignInManager<> следующим образом:

public class ApplicationSignInManager : SignInManager<ApplicationUser>
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly ApplicationDbContext _dbContext;
    private readonly IHttpContextAccessor _contextAccessor;

    public ApplicationSignInManager(
UserManager<ApplicationUser> userManager,
        IHttpContextAccessor contextAccessor,
        IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory,
        IOptions<IdentityOptions> optionsAccessor,
        ILogger<SignInManager<ApplicationUser>> logger,
        ApplicationDbContext dbContext,
        IAuthenticationSchemeProvider schemeProvider
        )
        : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemeProvider)
    {
        _userManager = userManager ?? throw new ArgumentNullException(nameof(userManager));
        _contextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor));
        _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
    }
}

, а затем добавил его в конфигурацию службв Startup.cs:

services.AddDefaultIdentity<ApplicationUser>(configure =>
{
    configure.User.AllowedUserNameCharacters += " ";
}).AddSignInManager<ApplicationSignInManager>()
  .AddDefaultUI(UIFramework.Bootstrap4)
  .AddEntityFrameworkStores<ApplicationDbContext>();

Проблема в том, что значение по умолчанию SignInManager<ApplicationUser> не может быть приведено к ApplicationSignInManager, поэтому я получаю эту ошибку при доступе к странице, в контроллер которой вводится менеджер:

InvalidCastException: Невозможно привести объект типа 'Microsoft.AspNetCore.Identity.SignInManager`1 [Socialize.Data.ApplicationUser]' для ввода 'Socialize.Utilities.Identity.ApplicationSignInManager' .

1 Ответ

1 голос
/ 19 марта 2019

Ваша проблема вызвана тем, что вы зарегистрировали AddSignInManager<ApplicationSignInManager>() до .AddDefaultUI(UIFramework.Bootstrap4).

Для AddDefaultUI , он вызовет builder.AddSignInManager (); , который зарегистрирует typeof(SignInManager<>).MakeGenericType(builder.UserType) и отменит ваши предыдущие настройки.

Попробуйте код ниже:

        services.AddDefaultIdentity<ApplicationUser>()                
            .AddDefaultUI(UIFramework.Bootstrap4)
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddSignInManager<ApplicationSignInManager>();
...