如何通过独立Identity Server实例实现APIM授权访问
我已将APIM实例配置为我方暴露的WebAPI的代理,希望通过Postman/.NET Client访问该APIM实例,并强制使用我方独立部署的Identity Server 4实例中配置的client_credentials模式(scope/secret/client_id)进行身份验证。我已查阅大量Stack Overflow帖子但未找到可行方案,对开发者门户的Oauth/OpenID不感兴趣,认为需要在某一APIM产品上配置入站策略,但不知如何操作。能否详细列出所需执行的步骤?相关端点如下:
- 授权端点:https://myidentityserver.azurewebsites.net/connect/authorize
- 令牌端点:https://myidentityserver.azurewebsites.net/connect/token
实现步骤详解
1. 在APIM中注册Identity Server 4作为OAuth2身份提供者
- 登录Azure门户,进入目标APIM实例
- 左侧导航栏选择安全性 > 身份提供者
- 点击添加,选择OAuth 2.0类型
- 填写核心配置项:
- 名称:自定义标识(例如
MyIDSP) - 客户端ID:填入Identity Server 4中已配置的客户端ID
- 客户端密码:填入对应客户端的secret
- 授权端点:填入你的授权端点地址
- 令牌端点:填入你的令牌端点地址
- 范围:填写需要验证的scope(多值用空格分隔)
- 授权流:勾选客户端凭据
- 名称:自定义标识(例如
- 点击创建完成注册
2. 为目标APIM产品添加入站JWT验证策略
- 进入APIM的产品页面,选择要应用验证的产品(或新建产品)
- 切换到策略标签页,选择入站处理
- 点击添加策略,选择验证JWT
- 配置验证规则:
- 选择使用OAuth 2.0身份提供者验证令牌,从下拉列表中选刚才注册的
MyIDSP - 勾选验证令牌签名,确保APIM能验证令牌的合法性
- 可选配置:设置受众(如果Identity Server 4的令牌包含
aud声明,需填入对应值)、开启令牌过期检查、验证issuer等
- 选择使用OAuth 2.0身份提供者验证令牌,从下拉列表中选刚才注册的
- 点击保存,策略会自动应用到该产品下的所有API
3. Postman测试流程
步骤1:获取Access Token
- 新建POST请求,地址为你的令牌端点
- 请求头设置
Content-Type: application/x-www-form-urlencoded - 请求体(form-data格式):
grant_type:client_credentialsclient_id: 你的客户端IDclient_secret: 你的客户端secretscope: 配置的目标scope
- 发送请求,提取返回结果中的
access_token
步骤2:调用APIM代理API
- 新建请求,地址为APIM暴露的API端点
- 请求头添加
Authorization: Bearer {你的access_token} - 发送请求:
- 令牌合法时,正常返回API数据
- 令牌无效/无权限时,APIM会返回401/403状态码
4. .NET客户端代码示例
using System.Net.Http.Headers; using System.Text.Json; // 配置参数 var clientId = "你的客户端ID"; var clientSecret = "你的客户端Secret"; var targetScope = "你的目标Scope"; var tokenEndpoint = "https://myidentityserver.azurewebsites.net/connect/token"; var apimApiUrl = "你的APIM代理API地址"; // 获取AccessToken using var tokenClient = new HttpClient(); var tokenRequest = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("grant_type", "client_credentials"), new KeyValuePair<string, string>("client_id", clientId), new KeyValuePair<string, string>("client_secret", clientSecret), new KeyValuePair<string, string>("scope", targetScope) }); var tokenResponse = await tokenClient.PostAsync(tokenEndpoint, tokenRequest); tokenResponse.EnsureSuccessStatusCode(); var tokenJson = JsonSerializer.Deserialize<JsonElement>(await tokenResponse.Content.ReadAsStringAsync()); var accessToken = tokenJson.GetProperty("access_token").GetString(); // 调用APIM代理API using var apiClient = new HttpClient(); apiClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); var apiResponse = await apiClient.GetAsync(apimApiUrl); apiResponse.EnsureSuccessStatusCode(); var responseContent = await apiResponse.Content.ReadAsStringAsync(); Console.WriteLine("API响应结果:"); Console.WriteLine(responseContent);
5. 关键注意事项
- 确保Identity Server 4中的客户端已启用
client_credentials授权流,且配置的scope已关联到对应的API资源 - APIM身份提供者的客户端ID、secret必须与Identity Server 4中的配置完全一致
- 若需更细粒度的权限控制,可在入站策略中添加检查JWT声明步骤,验证令牌中的特定claim(例如角色、权限)
- 遇到验证失败时,可通过APIM的监控 > 日志查看具体错误信息,定位问题
内容的提问来源于stack exchange,提问作者WebInspired
相关产品推荐
相关产品推荐

