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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:29:34