首页
学习
活动
专区
圈层
工具
发布

使用AAD验证WebAPI调用

使用 Azure Active Directory (AAD) 验证 Web API 调用

基础概念

Azure Active Directory (AAD) 是微软提供的基于云的身份和访问管理服务,用于保护 Web API 调用。AAD 验证使用 OAuth 2.0 和 OpenID Connect 协议来实现安全的身份验证和授权。

优势

  1. 集中式身份管理:统一管理用户身份和访问权限
  2. 多因素认证:支持多种验证方式增强安全性
  3. 单点登录:用户只需登录一次即可访问多个应用
  4. 标准化协议:基于行业标准的 OAuth 2.0 和 OpenID Connect
  5. 可扩展性:支持数百万用户和应用程序

实现类型

  1. 客户端凭据流:适用于服务到服务通信
  2. 授权码流:适用于有用户交互的Web应用
  3. 隐式流:适用于单页应用(SPA)
  4. 设备代码流:适用于无浏览器设备

应用场景

  • 企业内部的微服务架构
  • SaaS 应用程序的身份验证
  • 移动应用后端服务保护
  • 跨组织API访问控制

实现步骤

1. 在Azure门户中注册应用程序

首先需要在Azure AD中注册两个应用:

  • 一个用于客户端(请求API的应用)
  • 一个用于API服务(被调用的Web API)

2. 配置API应用

为API应用公开API范围并添加客户端应用为已知客户端。

3. 代码实现示例

Web API 端 (ASP.NET Core)

代码语言:txt
复制
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAd"));
    
    services.AddControllers();
}

// appsettings.json
{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "api-client-id",
    "Audience": "api-client-id"
  }
}

// Controller
[Authorize]
[ApiController]
[Route("[controller]")]
public class SecureController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok("Secure data");
    }
}

客户端调用示例 (C#)

代码语言:txt
复制
// 获取访问令牌
public async Task<string> GetAccessTokenAsync()
{
    var clientId = "client-app-id";
    var clientSecret = "client-secret";
    var tenantId = "tenant-id";
    var scope = "api://api-client-id/.default";
    
    var client = new HttpClient();
    var tokenEndpoint = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token";
    
    var request = new HttpRequestMessage(HttpMethod.Post, tokenEndpoint);
    var content = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("client_id", clientId),
        new KeyValuePair<string, string>("scope", scope),
        new KeyValuePair<string, string>("client_secret", clientSecret),
        new KeyValuePair<string, string>("grant_type", "client_credentials")
    });
    
    request.Content = content;
    var response = await client.SendAsync(request);
    var responseContent = await response.Content.ReadAsStringAsync();
    var tokenResponse = JsonSerializer.Deserialize<JsonElement>(responseContent);
    return tokenResponse.GetProperty("access_token").GetString();
}

// 调用受保护的API
public async Task<string> CallSecureApiAsync()
{
    var accessToken = await GetAccessTokenAsync();
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
    
    var response = await client.GetAsync("https://yourapi.azurewebsites.net/secure");
    return await response.Content.ReadAsStringAsync();
}

常见问题及解决方案

1. 401 未授权错误

原因

  • 令牌无效或过期
  • 令牌中缺少必要的声明或范围
  • API配置不正确

解决方案

  • 检查令牌是否有效且未过期
  • 验证API的受众(audience)设置是否正确
  • 确保客户端请求了正确的范围

2. 403 禁止访问错误

原因

  • 用户或服务主体没有足够的权限
  • 令牌中的角色声明不正确

解决方案

  • 检查API的授权策略
  • 验证用户或服务主体是否被授予了适当的角色

3. 令牌获取失败

原因

  • 客户端凭据不正确
  • 租户ID或客户端ID错误
  • 请求的范围不正确

解决方案

  • 仔细检查所有凭据和ID
  • 确保请求的范围与API公开的范围匹配

最佳实践

  1. 使用适当的令牌流(服务到服务使用客户端凭据,用户交互使用授权码流)
  2. 定期轮换客户端密钥
  3. 实现令牌缓存以避免频繁获取新令牌
  4. 为不同的环境使用不同的应用注册
  5. 监控和记录身份验证事件以进行安全审计

通过正确配置AAD验证,可以有效地保护Web API免受未经授权的访问,同时提供灵活的身份管理和访问控制。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券