如何将 Blazor WebAssembly 配置为要求整个应用使用经过身份验证的用户,而不是使用 [Authorize] 属性标记每个页面或控制器?
我的应用应仅允许授权用户,并且建议的配置在重定向到登录名之前加载页面的一小部分。
如果您的应用程序是独立的,一个简单的方法是在 pages 文件夹中添加新_Imports.razor
。 然后把这一行放进去。
@attribute [Authorize]
如果是自托管的。 尝试此链接以在浏览器中添加没有令牌的全局身份验证。
如何将 Blazor WebAssembly 配置为要求整个应用使用经过身份验证的用户,而不是使用 [Authorize] 属性标记每个页面或控制器?
您可以在主页加载时检查身份验证状态并决定下一步要执行的操作。
我的应用应仅允许授权用户,并且建议的配置在重定向到登录名之前加载页面的一小部分。
将下面的代码复制到Index.razor
@inject NavigationManager Navigation
@code{
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
protected async override Task OnInitializedAsync()
{
base.OnInitialized();
var authState = await authenticationStateTask;
var user = authState.User;
if(!user.Identity.IsAuthenticated)
{
Navigation.NavigateTo($"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}");
}
}
}
还有其他一些解决方案建议在不需要授权的页面上添加@attribute [Microsoft.AspNetCore.Authorization.Authorize]
_Imports.cs
和@attribute [Microsoft.AspNetCore.Authorization.AllowAnonymous]
。这从来没有像预期的那样对我有用,但很高兴知道它。
尝试在布局页面中使用[Authorize]
。
我的应用应仅允许授权用户,并且建议的配置在重定向到登录名之前加载少量页面。
您应该在App.razor
文件中执行此操作。它将先于其他任何方式执行,并确保用户在渲染任何其他组件之前经过身份验证和授权。
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly" PreferExactMatches="@true">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
@if (context.User.Identity != null && !context.User.Identity.IsAuthenticated)
{
<RedirectToLogin />
}
else
{
<p>You are not authorized to access this resource.</p>
}
</NotAuthorized>
<Authorizing>
<Loader />
</Authorizing>
</AuthorizeRouteView>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<div class="row justify-content-center">
<div class="col text-center">
<h2>Looks like you're lost, we didn't find anything at this location.</h2>
<p>Try navigating to the Dashboard or going back in the browser.</p>
</div>
</div>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>