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

如何在ASP.NET Core C#中验证MSAL返回的Azure用户ID?

验证Azure ID的两种方案(ASP.NET Core API)

首先明确:直接传递Azure ID到API存在被篡改的风险,优先推荐验证MSAL返回的ID Token的方式,这是微软身份认证的标准流程;如果确实需要通过Microsoft Graph验证Azure ID,也可以实现,以下是两种方案的具体步骤:

方案一:验证ID Token(最佳实践)

MSAL返回的ID Token本身是经过微软签名的JWT令牌,API可以通过验证令牌的合法性(签名、受众、过期时间等)来确认用户身份,同时从令牌的Claims中提取可信的Azure ID(对应oid声明)。

步骤1:API配置身份验证中间件

在Program.cs中添加Microsoft身份验证服务:

var builder = WebApplication.CreateBuilder(args);

// 添加Microsoft JWT身份验证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));

builder.Services.AddControllers();

var app = builder.Build();

// 启用身份验证和授权中间件
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

步骤2:配置Azure AD参数

在appsettings.json中添加Azure AD配置(需提前在Azure门户为API创建应用注册):

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "TenantId": "common", // 个人微软账户用`common`,企业租户填写租户ID
  "ClientId": "你的API应用注册ClientID"
}

步骤3:在Controller中获取并使用Azure ID

添加[Authorize]特性保护接口,通过User.Claims提取可信的Azure ID:

[ApiController]
[Route("api/user")]
[Authorize]
public class UserController : ControllerBase
{
    [HttpGet("verify")]
    public IActionResult VerifyUserIdentity()
    {
        // 从Claims中获取用户的Azure ID(oid声明是全局唯一的用户ID)
        var azureId = User.FindFirstValue("oid");
        
        if (string.IsNullOrEmpty(azureId))
        {
            return BadRequest("无法获取用户身份信息");
        }

        // 此处可添加业务逻辑验证
        return Ok(new { 
            AzureId = azureId, 
            IsVerified = true,
            UserName = User.FindFirstValue("name")
        });
    }
}

方案二:通过Microsoft Graph验证Azure ID

如果必须直接验证Azure ID的有效性,可以调用Microsoft Graph的/users/{id}接口,但这种方式需要API具备Graph权限,且存在额外的网络请求开销,同时无法防止ID被篡改(除非结合令牌验证)。

步骤1:配置Graph服务

在Program.cs中添加Microsoft Graph客户端:

var builder = WebApplication.CreateBuilder(args);

// 配置Microsoft Graph客户端(使用客户端凭据流)
builder.Services.AddMicrosoftGraph(options =>
{
    options.Scopes = new[] { "User.Read.All" };
})
.AddClientCredentialProvider(builder.Configuration.GetSection("AzureAd"));

builder.Services.AddControllers();

var app = builder.Build();

app.MapControllers();

app.Run();

步骤2:在Controller中调用Graph验证ID

注入GraphServiceClient,调用接口验证Azure ID:

[ApiController]
[Route("api/user")]
public class UserController : ControllerBase
{
    private readonly GraphServiceClient _graphClient;

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

    [HttpGet("verify-id/{azureId}")]
    public async Task<IActionResult> VerifyAzureId(string azureId)
    {
        try
        {
            // 调用Graph获取用户信息,若成功则ID有效
            var user = await _graphClient.Users[azureId]
                .Request()
                .Select(u => new { u.Id, u.DisplayName })
                .GetAsync();

            return Ok(new {
                AzureId = user.Id,
                IsVerified = true,
                DisplayName = user.DisplayName
            });
        }
        catch (ServiceException ex)
        {
            if (ex.StatusCode == HttpStatusCode.NotFound)
            {
                return NotFound("该Azure ID对应的用户不存在");
            }
            return StatusCode((int)ex.StatusCode, "验证请求失败");
        }
    }
}

注意事项

  • 使用Graph验证时,需要在Azure门户为API应用注册添加User.Read.All的应用权限(而非委托权限),并授予管理员同意。
  • 无论哪种方案,都不建议直接传递裸Azure ID而不附加身份验证信息,避免被恶意伪造。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:53:09