AuthenticationState не сохраняется после навигации - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть следующий пользовательский логин, добавленный в index.razor шаблона приложения Blazor по умолчанию (без аутентификации).

<form>
    <button @onclick="SignIn">Sign in</button>
</form>
@inject AuthenticationStateProvider AuthenticationStateProvider
@code {
    private string userName = "FakeUser";

    private async Task SignIn(MouseEventArgs e)
    {
        var fakeUser = new ClaimsPrincipal(new ClaimsIdentity(new[]
        {
            new Claim(ClaimTypes.Name, userName),
        }, "Fake authentication type"));

        var provider = (IHostEnvironmentAuthenticationStateProvider)AuthenticationStateProvider;
        //provider is ServerAuthenticationStateProvider

        provider.SetAuthenticationState(Task.FromResult(new AuthenticationState(fakeUser)));

        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        //authState.User.Identity.Name == "Fake User" - this is ok
    }
}

Однако при переходе на другую страницу authState не сохраняется:

protected override async Task OnInitializedAsync()
{
    var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
    //authState.User.Identity.Name == null ??
}

Почему?

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Я запустил ваш код, и он сохранил состояние аутентификации ...

Вот мой код:

Index.razor

@page "/"

@using System.Security.Claims;

<button @onclick="SignIn">Sign in</button>

@inject AuthenticationStateProvider AuthenticationStateProvider

@code {
    private string userName = "FakeUser";

    private async Task SignIn(MouseEventArgs e)
   {
      var fakeUser = new ClaimsPrincipal(new ClaimsIdentity(new[]
     {
        new Claim(ClaimTypes.Name, userName),
     }, "Fake authentication type"));

    var provider = 
    (IHostEnvironmentAuthenticationStateProvider)AuthenticationStateProvider;
    //provider is ServerAuthenticationStateProvider

    provider.SetAuthenticationState(Task.FromResult(new 
                                         AuthenticationState(fakeUser)));

    var authState = await 
               AuthenticationStateProvider.GetAuthenticationStateAsync();
               Console.WriteLine(authState.User.Identity.Name);


   }
}

Counter.razor

    @page "/counter"

    @inject AuthenticationStateProvider AuthenticationStateProvider


   @code {

         protected override async Task OnInitializedAsync()
         {
              var authState = await 
                   AuthenticationStateProvider.GetAuthenticationStateAsync();
              Console.WriteLine(authState.User.Identity.Name);
   }
 }

Пожалуйста, запустите ваше приложение, щелкните элемент кнопки, затем нажмите пункт меню «Счетчик» в NavMenu, чтобы перейти к компоненту «Счетчик» ... go теперь в окно «Вывод» и посмотрите, если слово FakeUser было напечатано дважды.

1 голос
/ 19 апреля 2020

Проблема заключалась в том, что <button> внутри собственного элемента <form>, поскольку он отправляет форму (страница перезагрузки)

<form>
    <button @onclick="SignIn">Sign in</button>
</form>

Решение:

Любое использование или

<button type="button" @onclick="SignIn">Sign in</button>
...