要求对整个Blazor Server应用程序进行身份验证



我正试图为我的Blazor Server应用程序添加自定义身份验证,但我无法将未经授权的用户重定向到登录页面。

我已经试过了:

这是我的应用程序。剃刀组件

<CascadingAuthenticationState>
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeRouteView>
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<PageTitle>No encontrado</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Dirección inválida.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>

这是我的RedirectToLogin组件

@inject NavigationManager NavManager
@code {
protected override async Task OnInitializedAsync()
{
NavManager.NavigateTo("/login", forceLoad: true);
}
}

但似乎从来没有到达<NotAuthorized>部分,因为我在OnInitializedAsync方法上设置了一个断点,调试也从未停止。

我使用cookie进行身份验证,它的工作原理就像我在MainLayout中添加了一个<AuthorizeView>标签来测试它,为未经身份验证的用户显示文本。

我可以让它工作,我缺少一个[Authorize]属性。

我把@attribute [Authorize]放在_Imports.razor文件中的@using指令之后,路由器下的<NotAuthorized>标记终于到达了,我只是简单地删除了RedirectToLogin组件,直接呈现Login组件。

此外,当我在那个级别使用[Authorize]时,我必须在登录组件上添加@attribute [AllowAnonymous]

因此,我的路由器是这样的:

<CascadingAuthenticationState>
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<Login />
</NotAuthorized>
</AuthorizeRouteView>
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<PageTitle>No encontrado</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Dirección inválida.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>

我的主布局是这样的:

<AuthorizeView>
<Authorized>
@*Normal layout when authorized*@
@Body
</Authorized>
<NotAuthorized>
@Body
</NotAuthorized>
</AuthorizeView>

登录组件只是一个带有用户名和密码字段的表单

组合AuthorizeView和RouteView的行为显示与指定路线匹配的页面,但仅当用户授权查看
这来自Microsoft文档

您可以尝试:
1-保持AuthorizeRouteView样本如下:
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
2-用包裹RedirectToLogin组件

<AuthorizeView>
<NotAuthorized>
//something
</NotAuthorized>
<Authorized>
//something
</Authorized>
</AuthorizeView>

相关内容

最新更新