.NET客户端通过Azure AD连接SignalR Hub时遇401未授权错误
.NET 6 SignalR Hub Azure AD认证401排查方案
一、令牌有效性与范围检查
- 用
jwt.ms解析客户端获取的令牌,验证以下核心字段:- aud(受众):必须与服务端应用注册的
Client ID或API ID URI完全匹配,不能是客户端自身的Client ID - iss(签发者):需对应Azure AD租户的STS地址,格式为
https://login.microsoftonline.com/{TenantId}/v2.0(v2.0应用注册),确保与服务端配置的租户ID一致 - scp/roles:如果服务端Hub有权限限制,令牌必须包含对应的
scp(委托权限)或roles(应用权限)声明,且该权限已在Azure Portal中完成授予与同意
- aud(受众):必须与服务端应用注册的
- 客户端获取令牌的范围必须正确:需请求服务端应用注册的API权限范围,格式通常为
api://{Server-Client-Id}/.default,不能使用客户端自身的权限范围
二、服务端认证中间件配置检查
- 确认Program.cs中中间件顺序:
app.UseAuthentication()必须在app.UseAuthorization()之前,且两者都要放在app.UseRouting()之后、app.UseEndpoints()之前 - 检查Azure AD认证绑定是否正确:
确保appsettings.json的builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));AzureAd节点包含Instance、TenantId、ClientId,且值与Azure Portal中服务端应用注册的信息完全一致 - 验证SignalR Hub授权配置:Hub类上的
[Authorize]属性无拼写错误;若使用自定义授权策略,需确认策略已在服务端正确注册
三、客户端令牌传递方式检查
- 优先使用SignalR推荐的
AccessTokenProvider传递令牌,避免WebSocket传输时Header丢失:_hubConnection.AccessTokenProvider = () => Task.FromResult(yourAccessToken); - 若手动设置Header,确认格式正确:
Authorization: Bearer {token},注意Bearer后必须有空格,且令牌未被截断或篡改 - 检查令牌是否过期:启动连接前确保获取的是最新令牌,避免使用已失效的令牌
四、服务端Hub授权逻辑检查
- 查看
ChatHubAuthorize.cs是否有额外授权限制,比如[Authorize(Roles = "Admin")]或自定义授权过滤器,需确保令牌包含对应声明 - 检查Hub的
OnConnectedAsync方法是否有自定义权限校验逻辑,若校验失败可能返回401错误
内容的提问来源于stack exchange,提问作者anhtv13
相关产品推荐
相关产品推荐

