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

能否导入部署在Azure外部的API至Azure API Manager?

结合你描述的多云(AWS+Azure)场景,以及EC2上部署的ASP.NET Web API 2带Swagger的情况,我整理了一套基于MSDN文档的Azure API Manager(APIM)授权配置方案,一步步来落地:

一、先完成APIM对EC2 API的导入与基础连通
  • 登录Azure门户进入你的APIM实例,找到API菜单,选择「从Swagger导入」,直接填入EC2上API的Swagger端点(比如http://<EC2公网IP>/swagger/docs/v1)——既然你确认端点可从Azure访问,直接导入即可,记得勾选「启用API」选项。
  • 导入完成后,APIM会自动生成对应API的所有操作,先通过APIM的测试控制台发个请求,确认能正常转发到EC2后端,确保基础连通性没问题。
二、配置APIM的授权机制(适配多云场景)

根据不同的安全需求,推荐两种常用的授权方案:

2.1 API密钥授权(快速落地的轻量方案)

  • 在APIM的API设置里,开启「API密钥」认证,然后到「订阅」菜单创建产品并关联该API,给不同客户端分配专属密钥。
  • 同时在EC2的ASP.NET Web API 2中添加API密钥验证过滤器,确保只有携带有效APIM密钥的请求才能访问后端:
public class ApiKeyAuthorizationFilter : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (!actionContext.Request.Headers.Contains("Ocp-Apim-Subscription-Key"))
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "Missing API key");
            return;
        }
        var apiKey = actionContext.Request.Headers.GetValues("Ocp-Apim-Subscription-Key").FirstOrDefault();
        // 这里可以和APIM配置的密钥做比对验证
        if (!IsValidApiKey(apiKey))
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "Invalid API key");
        }
    }
}
  • 把过滤器注册到WebApiConfig.cs中:
config.Filters.Add(new ApiKeyAuthorizationFilter());

2.2 OAuth2.0身份认证(企业级多云安全方案)

如果需要更严谨的身份管控,推荐用Azure AD作为身份提供商,同时支持AWS IAM角色联合:

  • 在Azure AD中注册应用,配置OAuth2.0授权端点,获取客户端ID和密钥。
  • 在APIM的API中开启「OAuth 2.0」认证,关联刚才的Azure AD应用,设置JWT令牌验证规则(比如验证签名、受众、过期时间等)。
  • 对于需要访问AWS资源的API操作,可在APIM中添加策略,将Azure AD令牌转换为AWS临时凭证(通过AWS STS服务),示例策略片段:
<send-request mode="new" response-variable-name="awsStsResponse" timeout="20" ignore-error="false">
    <set-url>https://sts.amazonaws.com/</set-url>
    <set-method>POST</set-method>
    <set-header name="Content-Type" exists-action="override">
        <value>application/x-www-form-urlencoded</value>
    </set-header>
    <set-body>Action=AssumeRoleWithWebIdentity&amp;RoleArn=arn:aws:iam::123456789012:role/YourAzureADTrustRole&amp;RoleSessionName=APIMSession&amp;WebIdentityToken=@(context.Request.Headers.GetValueOrDefault("Authorization").Replace("Bearer ", ""))&amp;DurationSeconds=3600</set-body>
</send-request>
<!-- 提取AWS凭证并设置到请求头 -->
<set-header name="Authorization" exists-action="override">
    <value>AWS @(context.Variables["awsStsResponse"].Body.AssumeRoleWithWebIdentityResponse.AssumeRoleWithWebIdentityResult.Credentials.AccessKeyId):@(context.Variables["awsStsResponse"].Body.AssumeRoleWithWebIdentityResponse.AssumeRoleWithWebIdentityResult.Credentials.SecretAccessKey)</value>
</set-header>
<set-header name="X-Amz-Security-Token" exists-action="override">
    <value>@(context.Variables["awsStsResponse"].Body.AssumeRoleWithWebIdentityResponse.AssumeRoleWithWebIdentityResult.Credentials.SessionToken)</value>
</set-header>
  • 在EC2的Web API中,使用Microsoft.Owin.Security.Jwt中间件添加JWT验证逻辑,确保请求携带的Azure AD令牌有效。
三、验证与调试
  • 用APIM的测试控制台分别测试带API密钥或OAuth令牌的请求,确认能正常访问EC2后端。
  • 如果遇到授权失败,可查看APIM的监控日志和EC2上的Web API日志,定位问题(比如令牌验证失败、密钥不匹配等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:45:36