需要对整个 Blazor Server 应用程序进行身份验证
Require authentication for entire Blazor Server app
我正在尝试为我的 Blazor Server 应用程序添加自定义身份验证,但无法将未经授权的用户重定向到登录页面。
我已经试过了:
这是我的app.razor组件
<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>
标记以测试它是否为未经过身份验证的用户显示文本时,它可以正常工作。
Combines the behaviors of AuthorizeView and RouteView, so that it
displays the page matching the specified route but only if the user is
authorized to see it.
This from Microsoft doc
你可以试试:
1- 让你 AuthorizeRouteView
这样的样本:
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
2- 用以下内容包装 RedirectToLogin
组件:
<AuthorizeView>
<NotAuthorized>
//something
</NotAuthorized>
<Authorized>
//something
</Authorized>
</AuthorizeView>
我可以让它工作,我缺少一个 [Authorize]
属性。
我在我的 _Imports.razor
文件中的 @using
指令之后放置了 @attribute [Authorize]
并且终于到达了 Router 下的 <NotAuthorized>
标签,我只是简单地删除了直接呈现登录的 RedirectToLogin 组件。
此外,由于我在该级别使用 [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>
我的 MainLayout 是这样的:
<AuthorizeView>
<Authorized>
@*Normal layout when authorized*@
@Body
</Authorized>
<NotAuthorized>
@Body
</NotAuthorized>
</AuthorizeView>
登录组件只是一个带有用户名和密码字段的表单
我正在尝试为我的 Blazor Server 应用程序添加自定义身份验证,但无法将未经授权的用户重定向到登录页面。
我已经试过了:
这是我的app.razor组件
<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>
标记以测试它是否为未经过身份验证的用户显示文本时,它可以正常工作。
Combines the behaviors of AuthorizeView and RouteView, so that it displays the page matching the specified route but only if the user is authorized to see it.
This from Microsoft doc
你可以试试:
1- 让你 AuthorizeRouteView
这样的样本:
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
2- 用以下内容包装 RedirectToLogin
组件:
<AuthorizeView>
<NotAuthorized>
//something
</NotAuthorized>
<Authorized>
//something
</Authorized>
</AuthorizeView>
我可以让它工作,我缺少一个 [Authorize]
属性。
我在我的 _Imports.razor
文件中的 @using
指令之后放置了 @attribute [Authorize]
并且终于到达了 Router 下的 <NotAuthorized>
标签,我只是简单地删除了直接呈现登录的 RedirectToLogin 组件。
此外,由于我在该级别使用 [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>
我的 MainLayout 是这样的:
<AuthorizeView>
<Authorized>
@*Normal layout when authorized*@
@Body
</Authorized>
<NotAuthorized>
@Body
</NotAuthorized>
</AuthorizeView>
登录组件只是一个带有用户名和密码字段的表单