我想为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'。
答案 0 :(得分:1)
您的问题是由您在AddSignInManager<ApplicationSignInManager>()
之前注册.AddDefaultUI(UIFramework.Bootstrap4)
引起的。
对于AddDefaultUI,它将调用builder.AddSignInManager();,后者将注册typeof(SignInManager<>).MakeGenericType(builder.UserType)
,并将覆盖您之前的设置。
尝试以下代码:
services.AddDefaultIdentity<ApplicationUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddSignInManager<ApplicationSignInManager>();