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

如何在Identity Server中读取Azure AD组ObjectIds?组声明缺失求助

解决Identity Server中Azure AD登录后组ObjectIds未出现在声明中的问题

我之前也碰到过一模一样的问题,折腾了好一阵才搞定,给你梳理几个关键的排查点和解决步骤:

1. 先确认Azure AD应用注册的权限配置

  • 首先得检查你在Azure AD的应用注册里,有没有添加GroupMember.Read.All或者Directory.Read.All权限。如果是要在用户登录时直接返回组信息,委派权限和应用权限都得配置到位;
  • 重中之重:权限添加后一定要点击授予管理员同意!这个步骤真的很容易忘,没做的话权限根本不会生效,组信息自然拿不到。

2. 配置Azure AD的组声明规则

  • 进入Azure AD应用注册的令牌配置页面,点击「添加组声明」:
    • 按需选择安全组或者所有组;
    • 在「组ID格式」里必须选Azure AD组ID(也就是你要的ObjectId),别误选成组名或其他格式;
    • 勾选「在ID令牌中返回」或者「在访问令牌中返回」,具体选哪个看你Identity Server接收的令牌类型。

3. 检查Identity Server的Azure AD登录配置

  • 确保你的Identity Server在配置Azure AD身份提供者时,正确映射了组声明,别把它过滤掉了。举个代码示例:
    .AddOpenIdConnect("AzureAD", options =>
    {
        options.ClientId = "你的客户端ID";
        options.Authority = "https://login.microsoftonline.com/你的租户ID/v2.0";
        options.ResponseType = "code id_token";
        // 映射groups声明,确保不会被默认规则忽略
        options.ClaimActions.MapUniqueJsonKey("groups", "groups");
        // 可以在令牌验证事件里调试,看看有没有拿到groups
        options.Events = new OpenIdConnectEvents
        {
            OnTokenValidated = context =>
            {
                var groups = context.Principal.FindAll("groups");
                // 这里可以打日志或者调试查看groups是否存在
                return Task.CompletedTask;
            }
        };
    })
    
  • 另外要注意,Identity Server的默认ClaimsProvider可能会过滤非标准声明,你需要确保groups声明没有被排除在外。

4. 直接检查令牌内容

  • 用JWT解析工具(本地调试工具或者代码里输出令牌内容都可以),看看Azure AD返回的ID令牌/访问令牌里有没有groups字段。如果令牌里本身就没有,那问题肯定在Azure AD的配置上;如果令牌里有但Identity Server里看不到,那就是Identity Server的声明映射或过滤逻辑出了问题。

5. 注意组数量的限制

  • 如果你的Azure AD里组数量超过了默认阈值(大概150个),Azure AD不会直接把所有组塞进令牌里,这时候你需要在Identity Server登录完成后,调用Microsoft Graph API去主动获取用户的所有组,再把这些组ID添加到用户声明中。

我当时就是漏了在令牌配置里选对组ID格式,还忘了给权限授予管理员同意,折腾了半天。你按这个顺序一步步排查,应该能解决问题。

内容的提问来源于stack exchange,提问作者infohpreet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:19:09