如何在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
相关产品推荐
相关产品推荐

