如何构建React+Azure AD认证场景下的.NET API授权服务?
React + Azure AD + .NET API 身份验证与授权实现方案
前端React侧适配(API调用准备)
- 确保React应用登录Azure AD后,获取Access Token而非ID Token——ID Token仅用于前端身份校验,Access Token才是调用后端API的合法凭证。
- 调用.NET API时,将Access Token放入请求头的
Authorization字段,格式为Bearer {token}:
const callProtectedApi = async () => { // 从Azure AD SDK(如@azure/msal-react)获取带权限的访问令牌 const tokenResponse = await instance.acquireTokenSilent({ scopes: ["api://{你的API客户端ID}/read"] // 对应Azure AD中API定义的权限范围 }); const token = tokenResponse.accessToken; const response = await fetch('https://your-api-domain/api/protected', { method: 'GET', headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) throw new Error('API访问失败'); return await response.json(); };
后端.NET API配置
1. 引入依赖
确保项目已安装身份验证包:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
2. 配置Azure AD身份验证
在Program.cs中注册JWT Bearer验证服务,关联Azure AD租户与API信息:
var builder = WebApplication.CreateBuilder(args); // 注册Azure AD身份验证服务 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = $"https://login.microsoftonline.com/{builder.Configuration["AzureAd:TenantId"]}"; options.Audience = builder.Configuration["AzureAd:ClientId"]; // API在Azure AD中的客户端ID或应用ID URI // 精细化令牌验证规则 options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ClockSkew = TimeSpan.Zero // 取消令牌过期校验的时间偏差 }; }); // 配置授权策略(支持角色/范围权限控制) builder.Services.AddAuthorization(options => { // 示例:基于API权限范围的自定义策略 options.AddPolicy("RequireReadScope", policy => { policy.RequireAuthenticatedUser(); policy.RequireClaim("scope", "api://{你的API客户端ID}/read"); }); }); builder.Services.AddControllers(); var app = builder.Build(); // 注意中间件顺序:先认证,后授权 app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
同时在appsettings.json中配置Azure AD参数:
{ "AzureAd": { "TenantId": "你的Azure AD租户ID", "ClientId": "你的API在Azure AD中的客户端ID" } }
3. 保护API端点
在控制器或Action上使用[Authorize]特性实现身份验证,如需细粒度权限控制,可结合角色或自定义策略:
[ApiController] [Route("api/[controller]")] public class ProtectedController : ControllerBase { // 所有已认证用户均可访问 [HttpGet] [Authorize] public IActionResult GetUserInfo() { // 从Claims中提取当前用户信息 var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value; var userName = User.FindFirst(ClaimTypes.Name)?.Value; return Ok(new { Message = "访问受保护API成功", UserId = userId, UserName = userName }); } // 仅拥有Admin角色的用户可访问 [HttpGet("admin")] [Authorize(Roles = "Admin")] public IActionResult GetAdminContent() { return Ok(new { Message = "仅管理员可见的敏感内容" }); } // 仅拥有指定API范围权限的用户可访问 [HttpGet("readonly")] [Authorize(Policy = "RequireReadScope")] public IActionResult GetReadOnlyData() { return Ok(new { Message = "仅拥有只读权限的用户可访问" }); } }
关键配置验证要点
- 在Azure AD中,确保React应用已被授予调用.NET API的权限(在React应用的"API权限"中添加对应API权限,并完成管理员同意)。
- 确认Access Token的
aud(受众)字段与.NET API配置的Audience完全一致,否则令牌验证会失败。 - 检查令牌的
exp(过期时间),可通过Azure AD SDK的静默刷新机制自动更新过期令牌。
内容的提问来源于stack exchange,提问作者Avanish
相关产品推荐
相关产品推荐

