Я попытался создать свою собственную страницу входа в приложение Blazor. Существует возможность использовать стандартные страницы регистрации / входа, но решил сделать их компонентами Blazor.
Проблема в том, что когда я пытаюсь войти, метод PasswordSignInAsyn c () просто начинает работать и ничего не происходит Нет никаких исключений, никаких предупреждений, никаких сообщений об ошибках. Я всегда ставлю точку останова на последующий метод, но он никогда не срабатывает, независимо от того, как долго я жду. Мой код:
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)
Есть ли способ определить, почему эта задача никогда не выполняется? Когда я использую эти представления по умолчанию, процесс входа в систему проходит гладко, поэтому я предполагаю, что он не имеет ничего общего с хэшированием пароля или формой электронной почты / имени пользователя.
Единственный момент, когда эта задача была фактически выполнена (и не выполнена), была, когда Я заменил параметр «Email» на весь объект «user».
EDIT: мне удалось получить эту ошибку из консоли браузера:
Error: System.InvalidOperationException: The response headers cannot be modified because the response has already started.
(...)
Я до сих пор не понимаю, почему это появляется, так как не выполняется процесс для изменения заголовков.