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

如何在ASP.NET Core 7中用证书通过Graph API获取用户所属组

在ASP.NET Core 7中通过Azure AD证书认证获取当前登录用户组名称

前提准备

  • 已在Azure AD中注册应用,并上传用于认证的证书(在应用「证书和密码」板块完成上传)
  • 为应用授予读取用户组的权限(如GroupMember.Read.All或Directory.Read.All,按需选择)

1. 配置项目设置(appsettings.json)

在配置文件中添加Azure AD相关配置,指定证书认证的参数:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "yourdomain.onmicrosoft.com",
    "TenantId": "你的租户ID",
    "ClientId": "你的客户端ID",
    "ClientCertificates": [
      {
        "SourceType": "Store",
        "StoreLocation": "CurrentUser",
        "StoreName": "My",
        "Thumbprint": "你的证书指纹"
      }
    ]
  }
}

若证书为本地文件,可将SourceType设为Path,并添加Path和Password字段指定证书路径及密码


2. 配置Program.cs中的认证服务

在Program.cs中配置Azure AD认证与Microsoft Graph服务(用于调用API获取组信息):

using Microsoft.AspNetCore.Authentication.AzureAD.UI;
using Microsoft.Identity.Web;

var builder = WebApplication.CreateBuilder(args);

// 添加Azure AD认证服务
builder.Services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options => builder.Configuration.Bind("AzureAd", options));

// 配置Microsoft Graph服务,使用证书认证调用API
builder.Services.AddMicrosoftGraph(options =>
{
    options.Scopes = "GroupMember.Read.All";
})
.AddClientCertificate();

builder.Services.AddControllersWithViews();

var app = builder.Build();

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

3. 获取用户组名称的两种方式

方式一:从ID Token中提取组ID(需提前配置组声明)

如果已在Azure AD应用「令牌配置」中添加组声明,可直接从用户Claims中获取组ID:

using System.Security.Claims;

public IActionResult Index()
{
    var groupIds = User.Claims
        .Where(c => c.Type == "groups" || c.Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid")
        .Select(c => c.Value)
        .ToList();
    return View(groupIds);
}

注:Token中默认仅返回组ID,如需名称需结合Graph API查询

方式二:调用Microsoft Graph API获取组名称

若需要完整的组名称或详细信息,通过Graph API查询:

using Microsoft.Graph;
using System.Security.Claims;

public class HomeController : Controller
{
    private readonly GraphServiceClient _graphServiceClient;

    public HomeController(GraphServiceClient graphServiceClient)
    {
        _graphServiceClient = graphServiceClient;
    }

    public async Task<IActionResult> Index()
    {
        // 获取当前用户ID
        var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
        
        // 调用Graph API获取用户所属组
        var groups = await _graphServiceClient.Users[userId].MemberOf.Request().GetAsync();
        
        // 提取组名称
        var groupNames = groups.CurrentPage
            .OfType<Group>()
            .Select(g => g.DisplayName)
            .ToList();

        return View(groupNames);
    }
}

注意事项

  • 应用的权限需经管理员同意(租户级权限场景)
  • 若使用证书存储方式,需确保运行项目的机器已安装对应证书
  • 根据实际需求调整Graph API的权限范围

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:57:41