我试图在Blazor应用程序中创建自己的登录页面。有一个选项可以使用默认的注册/登录页面,但决定使它们成为Blazor组件。
问题是当我尝试登录时,方法PasswordSignInAsync()才开始运行,什么也没发生。没有例外,没有警告,没有错误消息。我总是在后续方法上设置一个断点,但是无论我等待多长时间,它都不会被击中。我的代码:
Index.razor
@page "/"
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> Manager
@inject UserManager<IdentityUser> UserManager
@if (!IsLoginSuccessful)
{
<div>
<input type="text" @bind-value="@Email" />
<input type="password" @bind-value="@Password" />
<button @onclick="@PerformLogin">LogIn</button>
</div>
}
else
{
<p>You have successfully logged in!</p>
}
@code {
public string Email { get; set; }
public string Password { get; set; }
public bool IsLoginSuccessful { get; set; } = false;
public async Task PerformLogin()
{
var user = await UserManager.FindByEmailAsync(Email);
var check = await Manager.CheckPasswordSignInAsync(user, Password, false);
var result = await Manager.PasswordSignInAsync(Email, Password, false, false);
if (result.Succeeded)
{
IsLoginSuccessful = true;
}
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = false;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddScoped<AuthenticationStateProvider, RevalidatingIdentityAuthenticationStateProvider<IdentityUser>>();
(... my other DI methods)
有什么方法可以确定为什么此任务从未完成?当我使用这些默认视图时,登录过程会顺利进行,因此我认为它与密码哈希或电子邮件/用户名无关 表格。
该任务真正完成(和失败)的唯一时刻是当我用整个“ user”对象替换了“ Email”参数时。
编辑:我设法从浏览器控制台检索到此错误:
Error: System.InvalidOperationException: The response headers cannot be modified because the response has already started.
(...)
我仍然不知道为什么会出现这种情况,因为没有运行修改标头的过程。
答案 0 :(得分:0)
不幸的是,SignInManager在剃须刀页面中无法使用,
您必须在.cshtml页面(而不是.razor)中编写登录代码(以及需要与SignInManager一起使用的所有其他页面,例如ChangePassword,LogOut)。
然后,您可以重定向到根目录页面
答案 1 :(得分:0)
我有类似的问题。我已经使用VS的身份验证模板创建了blazor项目。我在blazor应用程序中不喜欢cshtml页面。由于blazor wasm是SPA框架,因此您可以轻松调用以首选语言编写的API。
例如,我使用了带有JWT身份验证的.net核心API。这种方法易于实现,并且您可以随时切换后端框架。 下面的链接可能有帮助。