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. 确保中间件顺序正确
中间件的加载顺序直接影响请求处理逻辑,正确的顺序应该是:
- 认证中间件(
UseAuthentication) - 授权中间件(
UseAuthorization) - gRPC-Web中间件(
UseGrpcWeb) - 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
相关产品推荐
相关产品推荐

