生成用户代签令牌时遭遇AADSTS50058无用户登录错误
解决AADSTS50058错误:应用权限场景下尝试用户断言令牌失败的问题
嘿,我之前也踩过这个坑,这个AADSTS50058错误的核心原因很明确:你的Web API当前处于没有用户上下文的应用权限场景中,却尝试用静默登录的方式获取用户断言令牌,Azure AD找不到对应的用户会话,自然就报错了。
咱们先拆解下你的场景:
- 客户端是用应用权限调用你的Web API的,这属于daemon模式——客户端直接以自己的应用身份发起请求,全程没有用户参与,你的Web API接收请求时也没有任何用户的登录信息。
- 而你尝试生成用户断言令牌,本质是要模拟某个用户去调用Azure REST API,但此时Web API里根本没有用户的会话数据,静默登录请求自然无从谈起。
下面根据你的实际业务需求,给出两种解决方案:
方案1:确实需要代表特定用户操作Azure资源
如果你的业务逻辑必须以某个用户的身份去操作资源,那你需要调整整个调用链的权限模式:
- 让客户端改用**委派权限(Delegated Permissions)**调用你的Web API,并且调用时带上用户的身份令牌(也就是客户端先让用户完成登录,拿到id_token后再请求你的API)。
- 你的Web API拿到用户的令牌后,使用On-Behalf-Of(OBO)流程向Azure AD申请针对Azure REST API的令牌。这样就能基于用户的身份去调用资源接口了。
方案2:不需要特定用户,Web API自身操作资源
如果业务逻辑不需要关联具体用户,只是Web API本身要管理Azure资源,那完全没必要用用户断言,直接用Web API自己的应用身份走客户端凭据流程即可:
- 在Azure AD的应用注册中,给你的Web API添加对Azure REST API的应用权限(比如Azure Resource Manager的
User Access Administrator等权限),记得要完成管理员同意。 - 在Web API中,用自身的客户端ID、客户端密钥(或证书)向Azure AD令牌端点请求资源令牌。举个C#的示例(用Microsoft.Identity.Client库):
var confidentialClient = ConfidentialClientApplicationBuilder .Create("你的Web API客户端ID") .WithClientSecret("你的Web API客户端密钥") .WithAuthority(new Uri("https://login.microsoftonline.com/你的租户ID")) .Build(); // 请求Azure资源管理器的令牌,scope用资源ID加.default var tokenResult = await confidentialClient.AcquireTokenForClient( new[] { "https://management.azure.com/.default" }) .ExecuteAsync(); // 用tokenResult.AccessToken调用Azure REST API
总结
你现在的问题本质是混淆了应用权限和委派权限的适用场景:应用权限是无用户上下文的daemon模式,而用户断言需要有用户会话支撑。根据你的业务需求选对流程,这个错误就能解决啦。
内容的提问来源于stack exchange,提问作者Manikanta Reddy
相关产品推荐
相关产品推荐

