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

如何构建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:25:22