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

Blazor+SignalR Core+微软身份平台Hub认证失败问题排查

解决AADSTS50013签名验证失败问题

核心问题分析

你遇到的AADSTS50013错误,根源在于GraphServiceClient的注入方式错误,以及可能的Azure AD配置遗漏:

  1. 手动创建的OnBehalfOfCredential使用了应用自身的Client Credential令牌,而非当前用户的访问令牌,导致签名验证失败。
  2. 自定义的GraphServiceClient注册覆盖了Microsoft.Identity.Web提供的正确实例,破坏了自动令牌获取逻辑。

解决方案步骤

1. 修正GraphServiceClient的注入逻辑

删除Program.cs中自定义的AddScoped<GraphServiceClient>代码块,保留Microsoft.Identity.Web提供的自动注册:

// 保留这段正确的注册,删除后面手动创建GraphServiceClient的代码
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
        .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
        .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph"))
        .AddInMemoryTokenCaches();

这段代码会自动注册正确的GraphServiceClient实例,它会利用当前用户的上下文获取令牌,并处理OnBehalfOf流程。

2. 检查Azure AD应用注册配置

  • 权限配置:确保应用注册添加了Delegated类型的User.Read权限,并已授予管理员同意(如果是租户级应用)。
  • 客户端凭据:确认配置文件中的ClientSecret与Azure AD中生成的客户端密钥完全一致,且密钥未过期。
  • 签名密钥有效性:错误提示中提到的密钥指纹F8A23743D9CD47B6D1A1FC66799A17A9B1D919EC,需在Azure AD应用注册的“证书和密码”中检查该密钥是否存在、未过期,且未被禁用。
  • OnBehalfOf流程启用:确保应用注册允许代表用户调用下游API,即已配置正确的API权限,且应用本身具有调用Microsoft Graph的权限。

3. 优化SignalR的身份传递

在Server-Side Blazor中,SignalR连接的身份传递可简化为直接使用WithUrl的默认身份验证逻辑,无需手动处理Cookie:

hubConnection = new HubConnectionBuilder()
    .WithUrl(Navigation.ToAbsoluteUri("/chathub"), options =>
    {
        options.UseDefaultCredentials = true;
    })
    .Build();

这样会自动传递当前用户的身份信息到SignalR Hub。

4. 验证Hub中的令牌获取

确保Hub中的AuthorizeForScopes特性正确配置,且GraphServiceClient能获取到用户的有效令牌:

[Authorize]
[AuthorizeForScopes(Scopes = new string[] { "user.read" })]
public class ChatHub : Hub
{
    private readonly GraphServiceClient _graphClient;

    public ChatHub(GraphServiceClient graphServiceClient)
    {
        _graphClient = graphServiceClient;
    }

    public async Task SendMessage(string message)
    {
        var user = await _graphClient.Me.GetAsync();
        if(user != null)
            await Clients.All.SendAsync("ReceiveMessage", user.DisplayName, message);
    }
}

关键说明

OnBehalfOf流程的核心是使用用户的访问令牌作为断言,而非应用自身的Client Credential令牌。Microsoft.Identity.Web已经封装了完整的令牌获取、缓存和刷新逻辑,手动创建GraphServiceClient会破坏这一机制,导致签名验证失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:54:59