在我带有 Identity 的 EF Core 8 Web 应用程序中,我的登录部分无法正常工作(不再)。
身份页面未加载,甚至似乎也未触发相应的控制器操作。
因此我无法使用身份功能。
我有一个自定义 UserManager
appUserManager<User>
和一个自定义用户类 User
。
我的
appuserManager<User>
现阶段没有进一步的方法,我只是准备课程而已。
public class AppUserManager : UserManager<User>
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly AppDbContext _context;
public AppUserManager(IUserStore<User> store,
IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<User> passwordHasher,
IEnumerable<IUserValidator<User>> userValidators,
IEnumerable<IPasswordValidator<User>> passwordValidators,
ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors,
IServiceProvider services,
ILogger<UserManager<User>> logger,
IHttpContextAccessor httpContextAccessor,
AppDbContext context)
: base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors,
services, logger)
{
_httpContextAccessor = httpContextAccessor;
_context = context;
}
[...]
}
因此,我在我的
program.cs
中注册了如下身份服务:
builder.Services.AddIdentity<User, Role>(options => options.Sign.RequireConfirmedAccount = true)
.AddSignInManager<SignInManager<User>>()
.AddEntityFrameworkStores<AppDbContext>()
.AddUserManager<AppUserManager>()
.AddRoleManager<AppRoleManager>()
.AddDefaultTokenProviders();
登录部分如下:
@using MyApp.Areas.Admin.Users
@using Microsoft.AspNetCore.Identity
@using MyApp.Areas.Admin.Sign
@inject SignInManager<User> SignInManager
@inject AppUserManager AppUserManager
<ul class="navbar-nav">
@if (SignInManager.IsSigned(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @User.Identity?.Name!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })">
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
现在发生的情况是,所有身份页面(登录、注册等)都没有加载,而是停留在我来自的页面上(所以没有重定向)。
我还注意到 URL 被称为
https://localhost:1234/?area=Identity&page=/Account/Login
而不是
https://localhost:1234/Identity/Account/Login.
如果我直接调用路由,则会收到 404 错误。
当我回滚自定义 appUserManager 类并在我的
program.cs
中注册默认身份服务时,我可以访问身份页面,并且它们按照 MS 的预期工作。
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.Sign.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<AppDbContext>();
我还尝试创建一个自定义的
appSignInManager
,直接使用User
类而不是IdentityUser
,但它也没有解决问题。
此外,我在原始
_loginPartial
的 program.cs
和 SignInManager
以及我的继承类与 User
/ IdentityUser
中测试了多种组合,但没有成功。
我可能只是因为没有发现明显的问题而盲目,但仍然 - 我不知道如何解决这个问题。
没关系,我发现了这个问题。 为了解决这个问题,我必须在
.AddDefaultUI()
类的身份服务注册中添加 program.cs
,然后注册 SignInManagers:
builder.Services.AddIdentity<User, Role>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<AppDbContext>()
.AddUserManager<AppUserManager>()
.AddRoleManager<AppRoleManager>()
.AddDefaultUI()
.AddDefaultTokenProviders();
builder.Services.TryAddScoped<SignInManager<User>, AppSignInManager>();
builder.Services.TryAddScoped<AppSignInManager, AppSignInManager>();