Перенаправление для входа в Blazor Server Azure B2C Authentication

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

Я попытался изменить app.razor для перенаправления, как показано ниже:

 <NotAuthorized>
                @if (!context.User.Identity.IsAuthenticated)
                {
                    <RedirectToLogin />
                }
                else
                {
                    <p>
                        You are not authorized to access 
                        this resource.
                    </p>
                }
            </NotAuthorized>

Это не сработало. Точка останова на @if (! Context.User.Identity.IsAuthenticated) никогда не срабатывает.

Я также попытался добавить раздел @code в MainLayout.razor, как показано ниже:

  [CascadingParameter] protected Task<AuthenticationState> AuthStat { get; set; }

    protected async override Task OnInitializedAsync()
    {
        base.OnInitialized();
        var user = (await AuthStat).User;
        if (!user.Identity.IsAuthenticated)
        {
            navMan.NavigateTo($"authentication/login?returnUrl={Uri.EscapeDataString(navMan.Uri)}");
        }
    }

Я предполагаю, что это происходит в каком-то цикле перенаправления, потому что я получаю сообщение об ошибке

Фильтрация запросов настроена на веб-сервере для отклонения запроса из-за слишком длинной строки запроса.

и запрошенный URL:

 https://localhost:44385/authentication/login?returnUrl=https%3A%2F%2Flocalhost%3A44385%2Fauthentication%2Flogin%3FreturnUrl%3Dhttps%253A%252F%252Flocalhost%253A44385%252Fauthentication%252Flogin%253FreturnUrl%253Dhttps%25253A%25252F%25252Flocalhost%25253A44385%25252Fauthentication%25252Flogin%25253FreturnUrl%25253Dhttps%2525253A%2525252F%2525252Flocalhost%2525253A44385%2525252Fauthentication%2525252Flogin%2525253FreturnUrl%2525253Dhttps%252525253A%252525252F%252525252Flocalhost%252525253A44385%252525252Fauthentication%252525252Flogin%252525253FreturnUrl%252525253Dhttps%25252525253A%25252525252F%25252525252Flocalhost%25252525253A44385%25252525252Fauthentication%25252525252Flogin%25252525253FreturnUrl%25252525253Dhttps%2525252525253A%2525252525252F%2525252525252Flocalhost%2525252525253A44385%2525252525252Fauthentication%2525252525252Flogin%2525252525253FreturnUrl%2525252525253Dhttps%252525252525253A%252525252525252F%252525252525252Flocalhost%252525252525253A44385%252525252525252Fauthentication%252525252525252Flogin%252525252525253FreturnUrl%252525252525253Dhttps%25252525252525253A%25252525252525252F%25252525252525252Flocalhost%25252525252525253A44385%25252525252525252Fauthentication%25252525252525252Flogin%25252525252525253FreturnUrl%25252525252525253Dhttps%2525252525252525253A%2525252525252525252F%2525252525252525252Flocalhost%2525252525252525253A44385%2525252525252525252Fauthentication%2525252525252525252Flogin%2525252525252525253FreturnUrl%2525252525252525253Dhttps%252525252525252525253A%252525252525252525252F%252525252525252525252Flocalhost%252525252525252525253A44385%252525252525252525252Fauthentication%252525252525252525252Flogin%252525252525252525253FreturnUrl%252525252525252525253Dhttps%25252525252525252525253A%25252525252525252525252F%25252525252525252525252Flocalhost%25252525252525252525253A44385%25252525252525252525252Fauthentication%25252525252525252525252Flogin%25252525252525252525253FreturnUrl%25252525252525252525253Dhttps%2525252525252525252525253A%2525252525252525252525252F%2525252525252525252525252Flocalhost%2525252525252525252525253A44385%2525252525252525252525252F

Может ли кто-нибудь предложить, как пользователя можно перенаправить на страницу входа, если он не прошел аутентификацию в проекте стороны Blazor Server с аутентификацией Azure B2C?


person Tanveer Khan    schedule 04.11.2020    source источник


Ответы (1)


Вы можете заставить пользователя войти в систему с указанными ниже изменениями.

Подход 1:

_Host.Cshtml Добавьте приведенный ниже код.

@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]

App.razor

<CascadingAuthenticationState>
    <Router AppAssembly="@typeof(Program).Assembly">
        <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
                <NotAuthorized>
                    <h4>Not authorized.</h4>
                </NotAuthorized>
                <Authorizing>
                    <h4>Authentication in progress...</h4>
                </Authorizing>
            </AuthorizeRouteView>
        </Found>
        <NotFound>
            <LayoutView Layout="@typeof(MainLayout)">
                <p>Sorry, there's nothing at this address.</p>
            </LayoutView>
        </NotFound>
    </Router>
</CascadingAuthenticationState>

MainLayout.razor

@inherits LayoutComponentBase

<div class="sidebar">
    <NavMenu />
</div>

<div class="main">
    <AuthorizeView>
        <NotAuthorized></NotAuthorized>            
        <Authorized>
            <div class="top-row px-4 auth">
                <LoginDisplay />
                <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
            </div>
            <div class="content px-4">
                @Body
            </div>
        </Authorized>
    </AuthorizeView>
</div>

Подход 2:

Другой способ перенаправления пользователя на страницу входа Внесите следующие изменения

_Host.Cshtml

<environment include="Staging,Production">            
            <component render-mode="ServerPrerendered" type="typeof(App)" />
        </environment>
        <environment include="Development">
            <component render-mode="Server" type="typeof(App)" />
        </environment>

Создайте RedirectToLogin.razor

@inject NavigationManager Navigation


@code {  

    protected override Task OnAfterRenderAsync(bool firstRender)
    {
        Navigation.NavigateTo("/AzureADB2C/Account/SignIn");
        return base.OnAfterRenderAsync(firstRender);
    }
}

MainLayout.razor

<div class="main">
    <div class="top-row px-4 auth">
        <LoginDisplay />
        <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
    </div>

    <div class="content px-4">
        <AuthorizeView>
            <Authorized>
                @Body
            </Authorized>
            <NotAuthorized>
                <Blazor_B2C.Pages.RedirectToLogin></Blazor_B2C.Pages.RedirectToLogin>
            </NotAuthorized>
        </AuthorizeView>
    </div>
</div>
person Raghavendra beldona    schedule 04.11.2020
comment
Я смущен. Вы выложили два MainLayout.razor - person Tanveer Khan; 11.11.2020
comment
На самом деле я предлагал два разных подхода. Я обновил свой ответ, пожалуйста, проверьте - person Raghavendra beldona; 11.11.2020
comment
Хм .. просто пытаюсь исправить это сам. Я вижу, что вы добавили [Authorize] в _Host.cshtml - но для приложений B2C это означает, что маршрутизация Blazor никогда не вызывается, она всегда перенаправляет на экран входа в систему B2C, что очень неудобно для пользователя. Если бы я добавил атрибут [AllowAnonymous], я мог бы разрешить доступ к страницам Blazor, но используйте ваши изменения в MainLayout, чтобы показывать приветственный контент до того, как людей попросят войти в систему. - person Quango; 17.12.2020