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

VB.NET桌面应用通过MS Graph访问Active Directory获取用户所属组方案咨询

你的理解完全正确,整个实现流程分为两步:第一步从微软身份平台获取有效访问令牌,第二步携带令牌调用MS Graph接口拉取用户分配的组信息。

前置配置校验(需先确认所有配置符合要求)
  • 应用注册的平台配置需添加「公共客户端(移动/桌面)」,不可使用Web平台配置,否则桌面端认证会触发重定向URI不匹配错误
  • API权限需添加Microsoft Graph的委托权限 GroupMember.Read.All,权限类型不要选择应用权限,添加完成后必须点击「授予管理员同意」生效
  • 桌面应用属于公共客户端,生产环境不建议使用clientSecret,避免泄露风险,测试场景可正常使用
代码实现(以C# WPF/WinForm桌面应用为例)

首先安装依赖NuGet包:
Install-Package Microsoft.Identity.Client
Install-Package Microsoft.Graph

完整代码示例:

using Microsoft.Identity.Client;
using Microsoft.Graph;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;

// 配置参数,替换为你自己的实际值
private const string TenantId = "你的租户ID";
private const string ClientId = "你的客户端ID";
private const string RedirectUri = "你的重定向URI";
// 申请的权限scope
private string[] Scopes = { "User.Read", "GroupMember.Read.All" };

public async Task<List<Group>> GetCurrentUserGroups()
{
    // 1. 初始化MSAL公共客户端
    var publicClient = PublicClientApplicationBuilder
        .Create(ClientId)
        .WithTenantId(TenantId)
        .WithRedirectUri(RedirectUri)
        .Build();

    AuthenticationResult authResult;
    try
    {
        // 优先尝试静默获取令牌
        var accounts = await publicClient.GetAccountsAsync();
        authResult = await publicClient.AcquireTokenSilent(Scopes, accounts.FirstOrDefault())
            .ExecuteAsync();
    }
    catch (MsalUiRequiredException)
    {
        // 静默获取失败,弹出交互式登录窗口
        authResult = await publicClient.AcquireTokenInteractive(Scopes)
            .ExecuteAsync();
        
        // 若无UI的桌面应用,可替换为设备码流实现登录
        // authResult = await publicClient.AcquireTokenWithDeviceCode(Scopes, deviceCodeResult =>
        // {
        //     Console.WriteLine(deviceCodeResult.Message);
        //     return Task.CompletedTask;
        // }).ExecuteAsync();
    }

    // 2. 初始化Graph客户端,调用接口获取用户所属组
    var graphClient = new GraphServiceClient(
        new DelegateAuthenticationProvider(async (requestMessage) =>
        {
            requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
        }));

    // 调用transitiveMemberOf获取包含嵌套的所有组,过滤出组类型的结果
    var memberOf = await graphClient.Me.TransitiveMemberOf
        .Request()
        .Filter("OData.Type eq 'microsoft.graph.group'")
        .GetAsync();

    return memberOf.OfType<Group>().ToList();
}
常见错误排查
  • 调用接口返回403:检查权限是否配置正确、是否已授予管理员同意、scope列表是否包含GroupMember.Read.All
  • 认证时提示重定向URI不匹配:检查应用注册的「身份验证」页面中,公共客户端的重定向URI和代码中配置的完全一致
  • 返回结果包含目录角色而非用户组:调整接口的Filter参数,仅返回group类型的结果即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:24:04