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

如何使用Azure为.NET 5 API实现JWT令牌认证与授权

.NET 5 API集成Azure JWT认证完整实现

一、实现/token端点获取Azure JWT令牌

1. 安装依赖包

安装用于调用Azure AD令牌服务的NuGet包:

Install-Package Microsoft.Identity.Client

2. 定义请求模型

创建接收scopes参数的模型类:

public class TokenRequest
{
    public string[] Scopes { get; set; }
}

3. 完善TokenController逻辑

注入配置项,调用Azure AD令牌端点获取JWT:

using Microsoft.Identity.Client;
using Microsoft.Extensions.Configuration;

public class TokenController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public TokenController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpPost]
    public async Task<ActionResult<string>> GetToken([FromBody] TokenRequest request)
    {
        if (request.Scopes == null || !request.Scopes.Any())
        {
            return BadRequest("Scopes参数不能为空");
        }

        // 从配置文件读取Azure AD应用信息
        var tenantId = _configuration["AzureAd:TenantId"];
        var clientId = _configuration["AzureAd:ClientId"];
        var clientSecret = _configuration["AzureAd:ClientSecret"];
        var authority = $"https://login.microsoftonline.com/{tenantId}/v2.0";

        // 构建机密客户端实例
        var app = ConfidentialClientApplicationBuilder
            .Create(clientId)
            .WithClientSecret(clientSecret)
            .WithAuthority(new Uri(authority))
            .Build();

        try
        {
            // 通过客户端凭证流获取令牌
            var result = await app.AcquireTokenForClient(request.Scopes)
                .ExecuteAsync();

            return Ok(result.AccessToken);
        }
        catch (MsalException ex)
        {
            return StatusCode((int)System.Net.HttpStatusCode.Unauthorized, ex.Message);
        }
    }
}

4. 配置Azure AD参数

在appsettings.json中添加Azure应用的配置信息:

{
  "AzureAd": {
    "TenantId": "你的Azure租户ID",
    "ClientId": "API应用的客户端ID",
    "ClientSecret": "API应用的客户端密钥"
  }
}

二、配置API的JWT授权保护

1. 添加认证服务

在Startup.cs的ConfigureServices方法中注册JWT认证:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;

public void ConfigureServices(IServiceCollection services)
{
    // 集成Azure AD JWT认证
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApi(_configuration.GetSection("AzureAd"));

    // 自定义授权策略(根据scopes控制访问)
    services.AddAuthorization(options =>
    {
        options.AddPolicy("ReadAccess", policy =>
            policy.RequireClaim("scp", "api://你的API应用ID/access_as_user"));
        options.AddPolicy("WriteAccess", policy =>
            policy.RequireClaim("scp", "api://你的API应用ID/write_data"));
    });

    services.AddControllers();
}

2. 启用认证授权中间件

在Startup.cs的Configure方法中添加中间件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 其他中间件(如异常处理、静态文件)

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

3. 保护API端点

在需要授权的控制器或方法上添加[Authorize]特性:

[ApiController]
[Route("api/[controller]")]
[Authorize] // 全局保护该控制器下所有端点
public class DataController : ControllerBase
{
    [HttpGet]
    [Authorize(Policy = "ReadAccess")] // 仅允许拥有指定scope的令牌访问
    public IActionResult GetData()
    {
        return Ok("已通过JWT认证授权,返回受保护数据");
    }

    [HttpPost]
    [Authorize(Policy = "WriteAccess")]
    public IActionResult PostData([FromBody] object data)
    {
        return Ok("数据已写入,操作已授权");
    }
}

注意事项

  • 确保Azure门户中API应用的「Expose an API」部分已配置对应scopes,且调用方应用已被授予这些scopes的权限
  • 上述示例使用客户端凭证流,适用于服务对服务的调用场景;如果是用户登录后访问API,需改用授权码流等用户参与的OAuth2.0流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:30:43