“AADSTS5002730:无效的 JWT 令牌。 Azure Signal R 服务令牌的代表方案中出现“签名算法的密钥不受支持”错误

Posted

技术标签:

【中文标题】“AADSTS5002730:无效的 JWT 令牌。 Azure Signal R 服务令牌的代表方案中出现“签名算法的密钥不受支持”错误【英文标题】:“AADSTS5002730: Invalid JWT token. Unsupported key for the signing algorithm” error in the on-behalf-of scenario for Azure Signal R Service token 【发布时间】:2021-11-05 01:57:17 【问题描述】:

当我尝试在代理场景中使用为 Azure Signal R 服务 (ASRS) 生成的 JWT 令牌时,出现上述错误。

以下是流程说明: Web 应用程序正在使用 react-adal 库来获取用户的访问令牌。然后它通过 Signal R 连接到 Web API A(通常通过 WebSockets),Web API A 从 HTTP 请求上下文中提取传递的令牌,在代理场景中使用它来获取 Web API B 的令牌并对 Web API B 进行授权 HTTP 调用。获取 Web API B 令牌的代码如下所示:

        var userAssertion = new UserAssertion(currentTokenForWebApiA, "urn:ietf:params:oauth:grant-type:jwt-bearer");
        var clientCredential = new ClientCredential(clientId, clientSecret);
        var authenticationContext = new AuthenticationContext("https://login.windows.net/....");
        var authenticationResult = await authenticationContext.AcquireTokenAsync(resource, clientCredential, userAssertion);

问题

当没有 Azure Signal R 服务(客户端直接打开 Signal R 连接到 Web API A)时,它工作正常。

但在默认模式下设置 Azure Signal R 服务后,我得到 AADSTS5002730: Invalid JWT token exception。

Azure Signal R 服务充当客户端和 Web API A 之间的代理,根据此 ASRS documentation 在“协商”请求期间客户端接收到重定向响应,其中包含由 Azure SignalR 服务 SDK 生成的新访问令牌。看起来它只支持访问令牌的 HMAC-SHA256HMAC-SHA512 签名算法。这个新的 HS256 令牌稍后会传递给 Web API A,并且 AcquireTokenAsync 方法失败并出现错误 AADSTS5002730。我比较了没有使用 ASRS 的令牌,当使用 ASRS 并且唱歌算法确实不同时,给出错误的新令牌是使用 HS256 而旧的令牌在 on代表场景使用RS256算法。

我不知道如何使当前的流程正常工作,您是否知道需要调整哪些内容才能使这个代表场景与 Azure Signal R 服务一起工作?由于 Web App A 在多个实例上的横向扩展,需要引入 ASRS。

【问题讨论】:

【参考方案1】:

请看看下面是否有任何解决方法。

首先检查clientId和secret是否正确。

如果您在 Azure ADAL 中注册了 API,则需要从 V1 端点获取令牌。如果您在位于 apps.dev.microsoft.com 的新应用门户中或使用 MSAL 库注册了它,则需要使用 V2 端点。 (您可以检查 aud clain 以查看端点 (v1 或 v2 )当您验证 jwt 令牌时)

MSAL 的 API 有点不同,您使用类 ConfidentialClientApplication 而不是 AuthenticationContext。这是来自sample app的sn-p

(或者如果那不是问题)

然后建议使用非对称 (RS256) 密钥,但当需要使用对称 (HS256) 密钥时,您可以验证 jwt 令牌,您可能必须在 issuersigninkey 的配置服务中手动设置它。

options.TokenValidationParameters = new TokenValidationParameters

    ValidateIssuer = true,
    ValidateAudience = true,
    ValidateLifetime = true,
    ValidateIssuerSigningKey = true,
    ValidIssuer = jwtIssuer,
    ValidAudience = jwtAudience,
    IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtKey)),

;

参考资料:

    JWT: Symmetic and Asymmetic Key Authentication In ASP.NET Core | by Nicklas Millard | Dev Genius asp-net-core-signalr-returns-401-unauthorized-using-azure-ad sp-net-core-azure-ad-v1-0-jwt-authentication-invalid-signature

【讨论】:

问题是令牌是由仅支持 HS256 和 HS512 算法 (github.com/Azure/azure-signalr/blob/…) 的 Azure Signal R Service SDK 生成的,所以我无法将其切换到 RS256。此外,错误 AADSTS5002730 从 Azure Active Directory (Azure AD) 安全令牌服务 (STS) 返回,而不是从我的应用程序返回,因此我不确定是否有任何方法可以更改 AADSTS 中的令牌验证选项。

以上是关于“AADSTS5002730:无效的 JWT 令牌。 Azure Signal R 服务令牌的代表方案中出现“签名算法的密钥不受支持”错误的主要内容,如果未能解决你的问题,请参考以下文章