如何在ASP.NET Core Web API的ClaimsPrincipal中获取Microsoft Entra身份令牌?
如何在ASP.NET Core Web API的ClaimsPrincipal中获取Microsoft Entra身份令牌?
嘿,我懂你刚上手Microsoft Entra,正在把Vue SPA搭配C# Web API的认证从Auth0迁移过来,而且已经搞定了应用注册、权限配置、自定义声明这些前期工作——接下来就是要在Web API里从ClaimsPrincipal拿到身份令牌对吧?我来给你捋捋具体操作:
首先得确保你的Web API已经正确配置了Microsoft Entra认证。在Program.cs里要添加认证服务并启用中间件:
// 添加Entra认证服务 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); // 启用认证和授权中间件(注意顺序,要放在路由之前) app.UseAuthentication(); app.UseAuthorization();
这里的AzureAd配置段要和你appsettings.json里的Entra应用注册信息对应,包括TenantId、ClientId这些关键参数。
接下来,在控制器里直接访问ClaimsPrincipal就很简单了——默认认证成功后,HttpContext.User就是对应的实例。比如在你的API控制器方法里:
[Authorize] [ApiController] [Route("api/[controller]")] public class SampleController : ControllerBase { [HttpGet("user-info")] public IActionResult GetUserInfo() { var claimsPrincipal = HttpContext.User; // 先确认用户已认证 if (!claimsPrincipal.Identity.IsAuthenticated) { return Unauthorized(); } // 获取你配置的自定义声明(替换成你实际的声明名称) var customClaimValue = claimsPrincipal.FindFirst("你的自定义声明键名")?.Value; // 获取标准声明,比如用户名、用户ID var userName = claimsPrincipal.Identity.Name; var userId = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier)?.Value; // 如果需要原始的JWT令牌字符串,从请求头提取 var rawToken = HttpContext.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last(); return Ok(new { UserName = userName, UserId = userId, CustomClaim = customClaimValue, RawToken = rawToken }); } }
还有几个要注意的点:
- 关于自定义声明:你在Entra应用注册里配置的自定义声明,只要manifest里的
acceptMappedClaims设为true,并且映射规则正确,就会自动出现在ClaimsPrincipal的Claims集合里,直接用FindFirst就能获取。 - 如果要在非控制器的服务类里访问
ClaimsPrincipal,可以注入IHttpContextAccessor,然后通过httpContextAccessor.HttpContext.User来获取。记得要先在Program.cs里注册这个服务:builder.Services.AddHttpContextAccessor(); - 一定要确保Web API的应用注册权限配置正确,否则认证会失败,
HttpContext.User就不会包含有效的声明数据。
内容来源于stack exchange
相关产品推荐
相关产品推荐

