You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:07:41