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非常便捷,步骤如下:
安装依赖包
在NuGet包管理器中安装:Microsoft.Identity.Web.MicrosoftGraph配置appsettings.json
添加Graph相关配置,指定API地址和所需权限:
"MicrosoftGraph": { "BaseUrl": "https://graph.microsoft.com/v1.0", "Scopes": "User.Read.All, AuditLog.Read.All" // 按需添加,比如读所有用户、读审计日志 }
- 注册Graph服务
在Program.cs中,把Graph服务添加到依赖注入容器:
builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration) .EnableTokenAcquisitionToCallDownstreamApi() .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph")) .AddInMemoryTokenCaches();
- 编写查询用户信息的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); } }
- 配置应用注册权限
登录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
相关产品推荐
相关产品推荐

