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

ASP.NET Core 7 gRPC服务器如何限制仅特定AD组用户访问?

解决ASP.NET Core 7 gRPC服务器特定AD组访问限制问题

核心问题诊断

  • 中间件顺序错误:UseAuthentication必须在UseAuthorization之前执行,否则授权逻辑会在用户认证完成前运行,导致未认证用户被错误放行。
  • HTTP/2与Negotiate兼容性问题:gRPC默认使用HTTP/2,Negotiate认证(Kerberos/NTLM)在该协议下需要适配配置,日志提示的Negotiate is not supported with HTTP/2是认证失败的直接原因。
  • 授权策略未绑定到gRPC端点:当前仅定义了授权策略,但未将其应用到实际的gRPC服务端点,导致策略未生效。

分步解决方案

1. 修正中间件执行顺序

将认证中间件移至授权中间件之前,确保用户先完成认证再进行授权校验:

var app = builder.Build();

// 必须先执行认证,再执行授权
app.UseAuthentication();
app.UseAuthorization();

app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client.");
    
app.Run();

2. 适配HTTP/2的Windows身份验证配置

针对gRPC的HTTP/2环境,优化Negotiate认证配置,确保支持Kerberos/NTLM:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate(options =>
    {
        // 若需启用Kerberos,需提前为服务器注册SPN(服务主体名称)
        // options.KerberosSettings.ServicePrincipalName = "HTTP/your-server-domain-name";
    });

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("ADGroupPolicy", policy =>
    {
        policy.RequireAuthenticatedUser();
        // 替换为实际AD组名称,格式为"域\\组名"或直接用组名(域环境默认时)
        policy.RequireRole("DOMAIN\\group1", "DOMAIN\\group2");
    });
});

3. 将授权策略绑定到gRPC端点

通过以下两种方式之一,让gRPC服务生效授权策略:

方式一:在gRPC服务类上添加特性标记

[Authorize(Policy = "ADGroupPolicy")]
public class YourGrpcService : YourGrpc.YourGrpcBase
{
    // 实现你的gRPC方法逻辑
}

方式二:在Program.cs映射端点时指定策略

app.MapGrpcService<YourGrpcService>()
    .RequireAuthorization("ADGroupPolicy");

4. 服务器环境配置

  • 若部署在IIS:启用Windows身份验证,禁用匿名身份验证。
  • 若使用Kestrel:确保服务器运行在域环境中,或已正确注册SPN以支持Kerberos认证(避免降级到NTLM)。

验证效果

配置完成后,非指定AD组用户访问gRPC服务时会收到Unauthorized错误,服务器日志不再出现Negotiate was not authenticated的提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:07:08