重定向以登录Blazor Server Azure B2C身份验证

时间:2020-11-04 09:12:52

标签: asp.net-core azure-ad-b2c blazor-server-side azure-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)}");
        }
    }

我认为THat会进入某种重定向循环,因为出现错误提示

“由于查询字符串太长,因此在Web服务器上将请求过滤配置为拒绝请求。”

和请求的网址:

 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

如果没有在使用Azure B2C身份验证的Blazor服务器端项目中进行身份验证的用户,可以有人建议如何将用户重定向到登录页面吗?

1 个答案:

答案 0 :(得分: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>