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

React+.NET8环境下如何通过代码访问Microsoft Entra External ID用户信息?

如何在React + .NET 8 Web API中访问Microsoft Entra External ID的用户信息

核心结论:是的,必须通过Microsoft Graph API来获取Entra External ID的用户数据和注册事件。因为Entra是云身份服务,没有本地的AspNetUsers/AspNetUserTokens这类数据库表,所有用户信息、操作日志都存储在Entra租户的云端,只能通过Graph API查询。

一、.NET 8 Web API 端集成Graph API

你已经用了Microsoft.Identity.Web,集成Graph非常便捷,步骤如下:

  1. 安装依赖包
    在NuGet包管理器中安装:Microsoft.Identity.Web.MicrosoftGraph

  2. 配置appsettings.json
    添加Graph相关配置,指定API地址和所需权限:

"MicrosoftGraph": {
  "BaseUrl": "https://graph.microsoft.com/v1.0",
  "Scopes": "User.Read.All, AuditLog.Read.All" // 按需添加,比如读所有用户、读审计日志
}
  1. 注册Graph服务
    在Program.cs中,把Graph服务添加到依赖注入容器:
builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph"))
    .AddInMemoryTokenCaches();
  1. 编写查询用户信息的API
    创建控制器,注入GraphServiceClient来调用Graph API:
[ApiController]
[Route("api/users")]
public class UsersController : ControllerBase
{
    private readonly GraphServiceClient _graphClient;

    public UsersController(GraphServiceClient graphClient)
    {
        _graphClient = graphClient;
    }

    // 获取所有用户
    [HttpGet]
    public async Task<IActionResult> GetAllUsers()
    {
        var users = await _graphClient.Users.Request().GetAsync();
        return Ok(users);
    }

    // 根据用户ID获取详情
    [HttpGet("{userId}")]
    public async Task<IActionResult> GetUserById(string userId)
    {
        var user = await _graphClient.Users[userId].Request().GetAsync();
        return Ok(user);
    }
}
  1. 配置应用注册权限
    登录Entra管理门户,找到你的Web API应用注册:
  • 进入“API权限”,点击“添加权限”→选择“Microsoft Graph”→选择“应用权限”
  • 添加User.Read.All(读所有用户)和AuditLog.Read.All(读审计日志,用于查询注册事件)
  • 点击“授予管理员同意”,确保权限生效

二、查询新用户注册事件

用户注册事件属于Entra的审计日志,通过Graph API的AuditLogs.DirectoryAudits接口查询:
在Users控制器中添加方法:

// 获取近7天的用户注册事件
[HttpGet("registration-events")]
public async Task<IActionResult> GetRegistrationEvents()
{
    var sevenDaysAgo = DateTime.UtcNow.AddDays(-7).ToString("yyyy-MM-ddTHH:mm:ssZ");
    // 筛选“添加用户”的审计事件
    var filter = $"activityDateTime ge {sevenDaysAgo} and activityDisplayName eq 'Add user'";

    var events = await _graphClient.AuditLogs.DirectoryAudits
        .Request()
        .Filter(filter)
        .GetAsync();

    return Ok(events);
}

三、React 端获取当前用户信息

如果只是获取当前登录用户的基础信息,不用调用Graph,MSAL已经在ID Token里返回了核心数据:

import { useMsal } from "@azure/msal-react";

function UserProfile() {
    const { accounts } = useMsal();
    const currentAccount = accounts[0];

    if (!currentAccount) return <div>请先登录</div>;

    return (
        <div>
            <h3>我的信息</h3>
            <p>用户名: {currentAccount.username}</p>
            <p>姓名: {currentAccount.idTokenClaims?.name}</p>
            <p>邮箱: {currentAccount.idTokenClaims?.email}</p>
            <p>用户ID: {currentAccount.localAccountId}</p>
        </div>
    );
}

export default UserProfile;

如果需要更多用户信息(比如扩展属性、所属组),建议通过你的Web API中转调用Graph,避免在前端暴露敏感权限。

四、关键注意事项

  • 权限类型:应用权限用于后台服务(无需用户登录),委托权限用于用户登录后以用户身份调用,根据场景选择。
  • 管理员同意:应用权限必须由租户管理员授予后才能生效,否则调用Graph会报错。
  • 令牌缓存:Microsoft.Identity.Web会自动处理Graph访问令牌的缓存,无需手动管理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:38:28