Blazor WebAssembly。在布局级别添加授权属性
Blazor WebAssembly. Add Authorize attribute at layout level
我从一个 visual studio 模板开始,这是一个新的 Blazor WebAssembly,带有身份验证和 Web API 作为服务器端。
我的问题是保护所有页面,而不仅仅是某些页面。我尝试添加:
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]
到 MainLayout 而不是所有页面,但没有任何运气。
我想这样做是因为我正在写一个管理员,如果没有连接,我根本不希望人们看到布局
I wanted to do that because I'm writing an admin and I don't want
people to see the layout at all if there are not connected
可以这么理解,当用户没有登录的时候,是不能进入任何页面的,所以这时候我们可以jump to the login page
对吧?
如果是这样,您可以通过以下步骤实现:
首先在当前blazor中创建一个RedirectToLogin.razor页面
项目。
本页OnInitializedAsync
方法中,通过判断是否
当前有用户登录,如果没有,重定向到
Login
页。
RedirectToLogin.razor:
@inject NavigationManager Navigation
@code {
[CascadingParameter]
private Task<AuthenticationState> AuthenticationStateTask { get; set; }
protected override async Task OnInitializedAsync()
{
var authenticationState = await AuthenticationStateTask;
if (authenticationState?.User?.Identity is null || !authenticationState.User.Identity.IsAuthenticated)
{
Navigation.NavigateTo("Identity/Account/Login", true);
}
}
}
然后在App.razor中加入如下代码,保证
NotAuthorized
将进入RedirectToLogin.razor
页面:
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeRouteView>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>
最后在MainLayout.razor页面中,做了区分
Authorized和NotAuthorized之间:
@inherits LayoutComponentBase
<AuthorizeView>
<Authorized>
<div class="sidebar">
<NavMenu />
</div>
<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">
@Body
</div>
</div>
</Authorized>
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeView>
测试结果如下:
将@attribute [Authorize] 放入 _Imports.razor 似乎有效。参见 。如果找不到路线,接受的答案可能无法正常工作。不过,您可以使用不同的 public 布局(不是 MainLayout)。
我从一个 visual studio 模板开始,这是一个新的 Blazor WebAssembly,带有身份验证和 Web API 作为服务器端。
我的问题是保护所有页面,而不仅仅是某些页面。我尝试添加:
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]
到 MainLayout 而不是所有页面,但没有任何运气。 我想这样做是因为我正在写一个管理员,如果没有连接,我根本不希望人们看到布局
I wanted to do that because I'm writing an admin and I don't want people to see the layout at all if there are not connected
可以这么理解,当用户没有登录的时候,是不能进入任何页面的,所以这时候我们可以jump to the login page
对吧?
如果是这样,您可以通过以下步骤实现:
首先在当前blazor中创建一个RedirectToLogin.razor页面 项目。
本页
OnInitializedAsync
方法中,通过判断是否 当前有用户登录,如果没有,重定向到Login
页。RedirectToLogin.razor:
@inject NavigationManager Navigation @code { [CascadingParameter] private Task<AuthenticationState> AuthenticationStateTask { get; set; } protected override async Task OnInitializedAsync() { var authenticationState = await AuthenticationStateTask; if (authenticationState?.User?.Identity is null || !authenticationState.User.Identity.IsAuthenticated) { Navigation.NavigateTo("Identity/Account/Login", true); } } }
然后在App.razor中加入如下代码,保证
NotAuthorized
将进入RedirectToLogin.razor
页面:<CascadingAuthenticationState> <Router AppAssembly="@typeof(Program).Assembly"> <Found Context="routeData"> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"> <NotAuthorized> <RedirectToLogin /> </NotAuthorized> </AuthorizeRouteView> </Found> <NotFound> <LayoutView Layout="@typeof(MainLayout)"> <p>Sorry, there's nothing at this address.</p> </LayoutView> </NotFound> </Router> </CascadingAuthenticationState>
最后在MainLayout.razor页面中,做了区分 Authorized和NotAuthorized之间:
@inherits LayoutComponentBase <AuthorizeView> <Authorized> <div class="sidebar"> <NavMenu /> </div> <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"> @Body </div> </div> </Authorized> <NotAuthorized> <RedirectToLogin /> </NotAuthorized> </AuthorizeView>
测试结果如下:
将@attribute [Authorize] 放入 _Imports.razor 似乎有效。参见