Asp. net страница входа - невозможно войти, используя PasswordSignInAsync - PullRequest
0 голосов
/ 26 апреля 2020

Я попытался создать свою собственную страницу входа в приложение 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.
(...)

Я до сих пор не понимаю, почему это появляется, так как не выполняется процесс для изменения заголовков.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

У меня была похожая проблема. Я создал блазорский проект с шаблоном аутентификации от VS. Мне не нравились страницы cs html в моем приложении для блейзоров. Поскольку Blazor Wasm является платформой SPA, вы можете легко вызывать API, написанный на вашем предпочтительном языке.

Например, я использовал. net базовый API с аутентификацией JWT. Этот подход прост в реализации, и в любое время вы можете переключать внутреннюю среду. Ссылка ниже может помочь.

blazorboilerplate

дополнительные_ресурсы

0 голосов
/ 27 апреля 2020

К сожалению, SignInManager не будет работать на бритвенных страницах, Вы должны написать свой код входа (и все другие страницы, которые должны работать с SignInManager, например, ChangePassword, LogOut) на странице .cs html вместо .razor Затем вы можете перенаправить на свою root страницу блейзора

...