使用Azure AD Graph API在无登录用户的情况下获取Entra用户列表时出现AADSTS53003错误
嘿,我来帮你搞定这个AADSTS53003的问题!这个错误说白了就是你的后台服务在访问目标租户的Entra数据时,要么租户信息没搞对,要么权限配置不到位,咱们一步步捋清楚:
首先得搞懂这个错误的核心:AADSTS53003一般提示“租户未找到或未启用对应服务”,在你这种多租户Blazor应用的后台任务场景里,大概率是这几个环节出了问题:
检查应用注册的多租户模式
你得先确认你的应用注册是设置成“任何组织目录中的账户”(多租户模式),要是设成“仅此组织目录中的账户”(单租户),那后台服务去访问其他租户的Entra数据肯定会被拒。另外,目标租户的管理员必须已经给你的应用授予了对应的权限——因为后台任务用的是应用权限,不是用户的委派权限,得管理员手动同意才行。确认应用权限的配置细节
别搞混了委派权限和应用权限!后台服务用客户端凭据流,必须加应用权限,比如User.Read.All或者Directory.Read.All这类,而且必须完成管理员同意。要是你加的是委派权限,那在没有用户登录的场景下根本用不了,这也会触发类似的错误。令牌请求的租户参数不能乱填
多租户场景下,获取访问令牌的时候,绝对不能用common作为租户ID,得填具体的目标租户ID,或者用organizations。因为common是用来让用户登录的,后台无用户的情况下,Azure AD没法识别你要访问哪个租户,自然就报租户找不到的错误了。验证目标租户的服务状态
虽然这个情况不多见,但还是得让目标租户的管理员确认下,他们的租户里Microsoft Graph服务是正常启用的,没有被禁用。
给你个我常用的C#代码示例,是Blazor服务器应用里用客户端凭据流获取用户列表的正确写法:
// 注意这里的tenantId必须是具体的目标租户ID var clientSecretCredential = new ClientSecretCredential( "你的目标租户ID", "你的应用客户端ID", "你的应用客户端密钥", new ClientSecretCredentialOptions { AuthorityHost = AzureAuthorityHosts.AzurePublicCloud }); var graphClient = new GraphServiceClient(clientSecretCredential); var userList = await graphClient.Users.GetAsync();
最后再提个关键注意点:如果你的应用要访问多个租户的用户,那得单独维护每个租户的ID,给每个租户单独获取令牌,因为每个租户的权限都是独立的,每个租户的管理员都得分别同意你的应用权限才行。
内容来源于stack exchange

