如何在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
相关产品推荐
相关产品推荐

