Azure Signal R OBO场景下AADSTS5002730无效JWT令牌问题问询
错误根因
AAD的OBO流程仅接受AAD自身签发的、采用RS256非对称签名的用户令牌作为断言输入。接入ASRS后Web API A拿到的是ASRS用HS256对称算法签发的代理令牌,该令牌仅用于ASRS和上游服务之间的身份校验,不是AAD签发的有效OBO断言,因此会触发签名算法不支持的报错。
适配方案
以下两种方案可直接解决问题,无需修改现有OBO核心逻辑:
- 方案1:透传原始AAD用户令牌
客户端建立SignalR连接时,将react-adal获取到的原始RS256 AAD用户令牌,通过自定义请求头或查询参数携带。ASRS默认会将客户端的自定义请求头完整透传给上游Web API A,你直接从请求头中取出该原始令牌,替换掉ASRS签发的HS256令牌传入UserAssertion即可。
对应代码调整仅需修改currentTokenForWebApiA的取值来源,原OBO请求代码无需改动:// 从透传的自定义头中取原始AAD令牌,而非默认Authorization头里的ASRS令牌 var currentTokenForWebApiA = Request.Headers["X-Original-Aad-Token"].FirstOrDefault(); 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); - 方案2:缓存原始令牌关联连接ID
客户端在调用negotiate接口获取ASRS连接信息时,就将原始AAD令牌传入服务端,服务端将令牌和返回的ASRS连接ID做关联存入分布式缓存,缓存过期时间和AAD令牌过期时间保持一致。后续ASRS转发请求到Web API A时,从请求中获取连接ID,再从缓存中取出对应的原始AAD令牌用于OBO流程。
该方案无需在WebSocket连接中反复携带令牌,适合对传输体积敏感的场景。
必要校验规则
无论采用哪种方案,都需要保留两层校验逻辑:
- 先校验ASRS签发的HS256令牌合法性,确认请求确实来自你配置的ASRS实例,避免恶意请求直接调用上游接口
- 再校验透传/缓存取出的原始AAD用户令牌合法性,确保用户身份有效后再执行OBO流程
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

