要在Blazor应用程序中实现在没有会话或JWT令牌的情况下重定向到登录页面,可以使用Blazor路由守卫。
以下是一个示例解决方案:
AuthGuard的类,实现Microsoft.AspNetCore.Authorization.IAuthorizationHandler接口:using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
public class AuthGuard : IAuthorizationHandler
{
private readonly NavigationManager _navigationManager;
private readonly AuthenticationStateProvider _authenticationStateProvider;
public AuthGuard(NavigationManager navigationManager, AuthenticationStateProvider authenticationStateProvider)
{
_navigationManager = navigationManager;
_authenticationStateProvider = authenticationStateProvider;
}
public async Task HandleAsync(AuthorizationHandlerContext context)
{
var authenticationState = await _authenticationStateProvider.GetAuthenticationStateAsync();
var user = authenticationState.User;
if (!user.Identity.IsAuthenticated)
{
_navigationManager.NavigateTo("/login"); // 重定向到登录页面
}
else
{
context.Succeed(context.Requirements[0]);
}
}
}
Startup.cs文件的ConfigureServices方法中注册AuthGuard:using Microsoft.AspNetCore.Authorization;
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddScoped();
services.AddScoped(); // 注册 AuthGuard
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAuthenticatedUser", policy =>
policy.Requirements.Add(new DenyAnonymousAuthorizationRequirement()));
});
}
App.razor组件中使用AuthorizeView组件和Policy属性来保护需要登录的页面:
Sorry, there's nothing at this address.
@code {
private class RedirectToLogin : ComponentBase
{
[Inject] NavigationManager NavigationManager { get; set; }
protected override void OnInitialized()
{
NavigationManager.NavigateTo("/login");
}
}
private class Loading : ComponentBase { }
}
在上述代码中,AuthGuard类实现了IAuthorizationHandler接口,并在HandleAsync方法中检查用户是否已通过身份验证。如果用户未通过身份验证,则使用NavigationManager重定向到登录页面。
在Startup.cs文件中,通过调用AddScoped将AuthGuard注册为依赖项注入服务。
在App.razor组件中,使用AuthorizeRouteView组件和NotAuthorized元素来捕获未经授权的访问,并将用户重定向到登录页面。