Метод Blazor SignInManager PasswordSignIn () выдает исключение InvalidOperationException

Я работаю над серверным проектом Blazor, для которого в настоящее время создаю настраиваемую страницу входа. Поскольку я не так много знаю о веб-приложениях (поэтому я использую Blazor), возможные решения, опубликованные в stackoverflow / github, пока что у меня не сработали.

Кстати: я хочу, чтобы встроенный SignInManager обрабатывал проверку учетных данных, предоставленных пользователем. Эти учетные данные устанавливаются как свойства экземпляра класса FormLoginUser.

public class FormLoginUser
{
    [Required, DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Required]
    public string Password { get; set; }
}

Код страницы входа выглядит следующим образом:

public class LoginBase : ComponentBase
{
    [Inject]
    private UserManager<ApplicationUser> userManager { get; set; }

    [Inject]
    private SignInManager<ApplicationUser> signInManager { get; set; }

    [Inject]
    private NavigationManager NavigationManager { get; set; }

    protected FormLoginUser User { get; set; }

    protected bool IsLoginFailed { get; set; }

    protected override void OnInitialized()
    {
        base.OnInitialized();
        IsLoginFailed = false;
        User = new FormLoginUser();
    }

    protected async Task ValidateUser()
    {
        SignInResult result = await signInManager.PasswordSignInAsync(
            userName: User.Email, 
            password: User.Password,
            isPersistent: true, 
            lockoutOnFailure: false);
        if (result.Succeeded)
            NavigationManager.NavigateTo("/");
        else
            IsLoginFailed = true;
        ShouldRender();
    }
}

Когда пользователь отправляет форму входа, вызывается метод ValidateUser(), к которому свойство User будет заполнено данными из формы. В первой строке метода ValidateUser() дела сразу идут не так.

Это выброшенное исключение:

Microsoft.AspNetCore.Components.Server.Circuits.RemoteRenderer: Warning: Unhandled exception rendering component: The response headers cannot be modified because the response has already started.

System.InvalidOperationException: The response headers cannot be modified because the response has already started.
   at Microsoft.AspNetCore.HttpSys.Internal.HeaderCollection.ThrowIfReadOnly()
   at Microsoft.AspNetCore.HttpSys.Internal.HeaderCollection.set_Item(String key, StringValues value)
   at Microsoft.AspNetCore.Http.ResponseCookies.Append(String key, String value, CookieOptions options)
   at Microsoft.AspNetCore.Authentication.Cookies.ChunkingCookieManager.AppendResponseCookie(HttpContext context, String key, String value, CookieOptions options)
   at Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler.HandleSignInAsync(ClaimsPrincipal user, AuthenticationProperties properties)
   at Microsoft.AspNetCore.Authentication.AuthenticationService.SignInAsync(HttpContext context, String scheme, ClaimsPrincipal principal, AuthenticationProperties properties)
   at Microsoft.AspNetCore.Identity.SignInManager`1.SignInWithClaimsAsync(TUser user, AuthenticationProperties authenticationProperties, IEnumerable`1 additionalClaims)
   at Microsoft.AspNetCore.Identity.SignInManager`1.SignInOrTwoFactorAsync(TUser user, Boolean isPersistent, String loginProvider, Boolean bypassTwoFactor)
   at Microsoft.AspNetCore.Identity.SignInManager`1.PasswordSignInAsync(TUser user, String password, Boolean isPersistent, Boolean lockoutOnFailure)
   at Microsoft.AspNetCore.Identity.SignInManager`1.PasswordSignInAsync(String userName, String password, Boolean isPersistent, Boolean lockoutOnFailure)
   at EvaluationPortal.Pages.Authentication.LoginBase.ValidateUser() in C:\dev\EvaluationPortal\Src\EvaluationPortal\Pages\Authentication\Login.razor.cs:line 33
   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
   at Microsoft.AspNetCore.Components.Forms.EditForm.HandleSubmitAsync()
   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle)
Microsoft.AspNetCore.Components.Server.Circuits.CircuitHost: Error: Unhandled exception in circuit 'j2FiQ7xmyQgNWl9lQDS5yHURzyFSUDlJyCeOu33qd-8'.

System.InvalidOperationException: The response headers cannot be modified because the response has already started.
   at Microsoft.AspNetCore.HttpSys.Internal.HeaderCollection.ThrowIfReadOnly()
   at Microsoft.AspNetCore.HttpSys.Internal.HeaderCollection.set_Item(String key, StringValues value)
   at Microsoft.AspNetCore.Http.ResponseCookies.Append(String key, String value, CookieOptions options)
   at Microsoft.AspNetCore.Authentication.Cookies.ChunkingCookieManager.AppendResponseCookie(HttpContext context, String key, String value, CookieOptions options)
   at Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler.HandleSignInAsync(ClaimsPrincipal user, AuthenticationProperties properties)
   at Microsoft.AspNetCore.Authentication.AuthenticationService.SignInAsync(HttpContext context, String scheme, ClaimsPrincipal principal, AuthenticationProperties properties)
   at Microsoft.AspNetCore.Identity.SignInManager`1.SignInWithClaimsAsync(TUser user, AuthenticationProperties authenticationProperties, IEnumerable`1 additionalClaims)
   at Microsoft.AspNetCore.Identity.SignInManager`1.SignInOrTwoFactorAsync(TUser user, Boolean isPersistent, String loginProvider, Boolean bypassTwoFactor)
   at Microsoft.AspNetCore.Identity.SignInManager`1.PasswordSignInAsync(TUser user, String password, Boolean isPersistent, Boolean lockoutOnFailure)
   at Microsoft.AspNetCore.Identity.SignInManager`1.PasswordSignInAsync(String userName, String password, Boolean isPersistent, Boolean lockoutOnFailure)
   at EvaluationPortal.Pages.Authentication.LoginBase.ValidateUser() in C:\dev\EvaluationPortal\Src\EvaluationPortal\Pages\Authentication\Login.razor.cs:line 33
   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
   at Microsoft.AspNetCore.Components.Forms.EditForm.HandleSubmitAsync()
   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle)

Кто-нибудь знает, что может вызвать это, я искал по всему Интернету, но, похоже, не нашел ничего, что решило бы эту проблему для меня. Пожалуйста помоги.


person Arnoud van Leeuwen    schedule 28.06.2020    source источник


Ответы (1)


У меня тоже было много проблем с аутентификацией Blazor, но это руководство мне действительно помогло из.

Я считаю, что он реализует ту же аутентификацию, которую вы пытаетесь использовать (Microsoft Identity).

person Hakej    schedule 28.06.2020
comment
Спасибо, что указали мне на это, но учебные пособия в основном воссоздают только то, что вы получаете из коробки, если вы выбираете авторизацию пользователя при запуске. Я ищу, почему SignInManager не позволяет мне войти в систему. - person Arnoud van Leeuwen; 29.06.2020