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

Blazor WASM+ASP.NET Core+OpenIddict:加[AllowAnonymous]仍无法发起未授权gRPC请求

解决Blazor WASM + gRPC-Web + OpenIddict未授权请求被禁止的问题

针对你遇到的未授权用户调用带[AllowAnonymous]特性的gRPC服务仍被OpenIddict拦截的问题,可从以下几个方向排查解决:

1. 检查全局授权策略是否强制认证

如果你的应用在配置授权时设置了全局默认策略要求用户必须认证,即使gRPC服务加了[AllowAnonymous],也可能被全局策略覆盖。

查看Program.cs(或Startup.cs)中的授权配置:

builder.Services.AddAuthorization(options =>
{
    // 若存在这行,说明全局默认要求认证
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

解决方法:在映射gRPC端点时,显式指定允许匿名的授权规则,覆盖全局策略:

app.MapGrpcService<YourPublicGrpcService>()
   .EnableGrpcWeb()
   .RequireAuthorization(auth => auth.AllowAnonymous());

2. 确保中间件顺序正确

中间件的加载顺序直接影响请求处理逻辑,正确的顺序应该是:

  1. 认证中间件(UseAuthentication)
  2. 授权中间件(UseAuthorization)
  3. gRPC-Web中间件(UseGrpcWeb)
  4. gRPC端点映射

示例代码:

// 先启用认证和授权
app.UseAuthentication();
app.UseAuthorization();

// 启用gRPC-Web,必须在映射gRPC服务之前
app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true });

// 映射公共gRPC服务并允许匿名
app.MapGrpcService<PublicDataService>()
   .EnableGrpcWeb()
   .RequireAuthorization(auth => auth.AllowAnonymous());

// 映射需要授权的gRPC服务
app.MapGrpcService<ProtectedDataService>()
   .EnableGrpcWeb();

3. 让OpenIddict服务器忽略公共gRPC端点

OpenIddict的服务器中间件可能会对所有请求进行认证检查,需要显式排除不需要授权的gRPC端点。

在OpenIddict服务器配置中添加忽略规则:

builder.Services.AddOpenIddict()
    .AddServer(options =>
    {
        // 其他OpenIddict配置...
        
        // 忽略指定的公共gRPC服务端点
        options.IgnoreEndpoint(context =>
        {
            return context.Request.Path.StartsWithSegments("/yourpublicservice") &&
                   context.Request.ContentType.StartsWith("application/grpc-web");
        });
    });

这里通过请求路径和gRPC-Web特有的Content-Type(application/grpc-web或application/grpc-web-text)来精准匹配需要忽略的请求。

4. 确认[AllowAnonymous]特性的应用范围

  • 如果整个gRPC服务都允许匿名,将[AllowAnonymous]加在服务类上:
    [AllowAnonymous]
    public class PublicDataService : PublicData.PublicDataBase
    {
        // 服务方法实现
    }
    
  • 如果仅单个方法允许匿名,将特性加在对应的方法上:
    public class MixedDataService : MixedData.MixedDataBase
    {
        [AllowAnonymous]
        public override Task<PublicResponse> GetPublicInfo(PublicRequest request, ServerCallContext context)
        {
            // 方法实现
        }
    
        // 此方法需要授权
        public override Task<ProtectedResponse> GetProtectedInfo(ProtectedRequest request, ServerCallContext context)
        {
            // 方法实现
        }
    }
    

5. 排查其他拦截中间件

检查是否有自定义的认证/授权中间件、请求拦截器等,在OpenIddict之前处理了请求,导致[AllowAnonymous]特性未生效。


内容的提问来源于stack exchange,提问作者KeyKiller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:01:07