Перенаправление тайм-аута сеанса в блейзоре на стороне сервера

#asp.net-core #blazor #blazor-server-side

#asp.net-core #блейзор #блейзор на стороне сервера

Вопрос:

Похоже, что Blazor в настоящее время не поддерживает проверку времени ожидания аутентификации из-за бездействия с использованием скользящей схемы истечения срока действия.

чего я пытаюсь добиться, так это перенаправить пользователя на страницу входа после того, как у него было время сеанса. Я могу себе представить, что это должно быть что-то, RevalidatingIdentityAuthenticationStateProvider где мне нужно обнаруживать активность на сайте и перенаправлять пользователя на страницу входа в систему, если сеанс имеет тайм-аут, но не уверен, как я могу этого добиться?

Ответ №1:

на самом деле вам не нужно использовать

RevalidatingIdentityAuthenticationStateProvider

ваше app.razor просто должно выглядеть как этот код:

 <CascadingAuthenticationState> 
    <Router AppAssembly="@typeof(Program).Assembly">
        <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData" 
                     DefaultLayout="@typeof(MainLayout)">
                <NotAuthorized>
                    **<RedirectToLogin> </RedirectToLogin>**
                </NotAuthorized>
                <Authorizing>
                    <h1>Authentication in progress</h1>
                    <p>Only visible while authentication is in progress.</p>
                </Authorizing>
            </AuthorizeRouteView>
        </Found>
        <NotFound>
           ....
        </NotFound>
    </Router>
</CascadingAuthenticationState>
  

убедитесь, что компонент RedirectToLogin перенаправляет пользователя на обратный вызов afterRender
должно выглядеть примерно так

  [CascadingParameter]
    private Task<AuthenticationState> AuthenticationStateTask { get; set; }

    protected override async Task OnAfterRenderAsync(bool firstRender)
      {
        var authenticationState = await AuthenticationStateTask;
        try
        {
            if (authenticationState?.User?.Identity is null || !authenticationState.User.Identity.IsAuthenticated)
                {
                    var returnUrl = Navigation.ToBaseRelativePath(Navigation.Uri);

                    if (string.IsNullOrWhiteSpace(returnUrl))
                        Navigation.NavigateTo("/Identity/Account/Login", true);
                    else
                        Navigation.NavigateTo($"/Identity/Account/Login?returnUrl=~/{returnUrl}", true);
                }
        }
        catch (Exception e)
        {

            
        }
       
    }
  

Комментарии:

1. интересно, как ваш код достигнет запрошенной цели тайм-аута бездействия? Ваш тест перенаправления заключается в том, чтобы определить, authenticationState?.User?.Identity is null однако для параметра authenticationState никогда не устанавливается значение null ни на одном таймере в вашем примере. Как это приведет к выходу из системы / перенаправлению после X минут бездействия?

2. PS: Я спрашиваю, потому что у меня такая же проблема, и я пришел сюда в поисках идей 🙂

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