Blazor WASM中按失败授权策略差异化重定向实现问询
在Blazor WASM中根据授权策略失败实现定向重定向
完全可以实现这个需求,核心思路是通过自定义授权结果处理逻辑,针对不同策略的失败情况执行特定重定向操作,以下是两种可行方案:
方案一:全局自定义授权结果处理器(推荐)
通过实现IAuthorizationMiddlewareResultHandler接口,拦截所有授权请求的结果,根据失败的策略类型执行对应重定向:
- 定义PolicyA的授权需求
public class PolicyARequirement : IAuthorizationRequirement { }
- 注册PolicyA并添加自定义处理器
在Program.cs中配置授权服务,同时注册自定义处理器:
builder.Services.AddAuthorizationCore(options => { options.AddPolicy("PolicyA", policy => policy.RequireAuthenticatedUser().AddRequirements(new PolicyARequirement())); }); // 注册自定义授权结果处理器 builder.Services.AddScoped<IAuthorizationMiddlewareResultHandler, CustomAuthorizationMiddlewareResultHandler>();
- 实现自定义授权结果处理器
using Microsoft.AspNetCore.Authorization; public class CustomAuthorizationMiddlewareResultHandler : IAuthorizationMiddlewareResultHandler { private readonly AuthorizationMiddlewareResultHandler _defaultHandler = new(); public async Task HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult) { // 检测是否是PolicyA验证失败 if (!authorizeResult.Succeeded && policy.Requirements.Any(r => r is PolicyARequirement)) { // 重定向到pageB context.Response.Redirect("/pageB"); return; } // 其他授权场景使用默认处理逻辑 await _defaultHandler.HandleAsync(next, context, policy, authorizeResult); } }
- 为pageA添加PolicyA授权
在pageA的razor页面中添加授权属性:
@page "/pageA" @attribute [Authorize(Policy = "PolicyA")] <h3>Page A</h3>
方案二:页面级手动授权检查
如果只需要针对单个页面处理,可在页面初始化时手动验证授权状态并执行重定向:
@page "/pageA" @inject IAuthorizationService AuthorizationService @inject NavigationManager NavigationManager <h3>Page A</h3> @code { protected override async Task OnInitializedAsync() { var authResult = await AuthorizationService.AuthorizeAsync(User, "PolicyA"); if (!authResult.Succeeded) { NavigationManager.NavigateTo("/pageB"); } } }
这种方式仅作用于当前页面,适合局部场景;方案一则是全局拦截,更适合多页面统一处理不同策略的授权失败场景。
内容的提问来源于stack exchange,提问作者Goran
相关产品推荐
相关产品推荐

