能否导入部署在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&RoleArn=arn:aws:iam::123456789012:role/YourAzureADTrustRole&RoleSessionName=APIMSession&WebIdentityToken=@(context.Request.Headers.GetValueOrDefault("Authorization").Replace("Bearer ", ""))&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
相关产品推荐
相关产品推荐

