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

生成用户代签令牌时遭遇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自己的应用身份走客户端凭据流程即可:

  1. 在Azure AD的应用注册中,给你的Web API添加对Azure REST API的应用权限(比如Azure Resource Manager的User Access Administrator等权限),记得要完成管理员同意。
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:05:01