IAuthorizationMiddlewareHandler未检查角色:Blazor WASM角色授权失效求助
Blazor WASM服务器端角色授权失效的解决方法
你在Blazor WASM应用服务器端自定义了BlazorAuthorizationMiddlewareResultHandler来规避.NET 8的认证bug,但添加[Authorize(Roles="test")]角色限制后,系统忽略角色检查直接放行。当前HandleAsync方法直接返回next(context),完全未处理授权结果。
修复自定义授权结果处理器
修改BlazorAuthorizationMiddlewareResultHandler的实现,添加对授权结果的检查逻辑,确保授权失败时拒绝请求:
public class BlazorAuthorizationMiddlewareResultHandler : IAuthorizationMiddlewareResultHandler { // 引入默认处理器处理授权失败的场景 private readonly AuthorizationMiddlewareResultHandler _defaultHandler = new(); public async Task HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult) { // 检查授权是否成功 if (!authorizeResult.Succeeded) { // 授权失败时,交给默认处理器处理(框架会自动返回403或重定向到登录页) await _defaultHandler.HandleAsync(next, context, policy, authorizeResult); return; } // 授权成功,继续执行后续请求逻辑 await next(context); } }
关键说明
- 原代码的问题在于完全忽略了
authorizeResult的状态,不管角色检查是否通过都直接放行请求,导致角色限制失效。 - 通过引入默认的
AuthorizationMiddlewareResultHandler,可以复用框架自带的授权失败处理逻辑(比如针对未认证用户重定向到登录页,针对无权限用户返回403状态码)。 - 如果需要自定义授权失败的响应,也可以替换默认处理器的逻辑,例如直接返回403和提示信息:
if (!authorizeResult.Succeeded) { context.Response.StatusCode = StatusCodes.Status403Forbidden; await context.Response.WriteAsync("您没有访问该资源的权限"); return; }
确认注册
确保在Program.cs中正确注册自定义处理器:
builder.Services.AddSingleton<IAuthorizationMiddlewareResultHandler, BlazorAuthorizationMiddlewareResultHandler>();
内容的提问来源于stack exchange,提问作者coolblue2000
相关产品推荐
相关产品推荐

