Azure API Management是一种云托管服务,可以在任何平台上为现有HTTP API添加许多功能。这包括与安全性,API密钥管理,缓存,文档和许多其他交叉策略相关的功能。有关详细信息,请参阅:http://azure.microsoft.com/apim
用于验证 B2B 令牌以及 B2C 租户令牌端点的 APIM 策略
在 azure api 管理服务中为单个 api 添加 b2b 和 b2c 端点的多个 validate-jwt 策略是否有效? # B2C 端点 在 azure api 管理服务中为单个 api 添加多个 b2b 和 b2c 端点的 validate-jwt 策略是否有效? # b2c endpoint <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid."> <openid-config url="https://login.microsoftonline.com/tfp/contoso.onmicrosoft.com/b2c_1_signin/v2.0/.well-known/openid-configuration" /> <audiences> ... </validate-jwt> # b2b endpoint <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid."> <openid-config url="https://login.microsoftonline.com/contoso.onmicrosoft.com/.well-known/openid-configuration" /> <audiences> ... </validate-jwt> 是的,您可以在单个 API 中添加多个 validate-jwt 策略,但在 b2c 和 b2b 等某些条件下,您需要将每个 validate-jwt 保留在 <choose> 块中。 如果您在共享时直接添加它们,那么它会将令牌与两个端点进行比较,并会给您 401 错误,因为其中之一永远不会匹配。 所以,建议将其保留在<choose>块中。 您可以在 <when> 中给出任何您想要的条件,以在 b2b 和 b2c 之间进行过滤。因此,传入请求标头中的令牌将与正确的端点进行比较。 <policies> <inbound> <base /> <choose> <!-- B2C Endpoint --> <when condition="@(context.Request.OriginalUrl.Contains('/b2c'))"> <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid."> <openid-config url="https://login.microsoftonline.com/tfp/contoso.onmicrosoft.com/b2c_1_signin/v2.0/.well-known/openid-configuration" /> <audiences> <audience>Your_B2C_Client_ID</audience> </audiences> </validate-jwt> </when> <!-- B2B Endpoint --> <when condition="@(context.Request.OriginalUrl.Contains('/b2b'))"> <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid."> <openid-config url="https://login.microsoftonline.com/contoso.onmicrosoft.com/.well-known/openid-configuration" /> <audiences> <audience>Your_B2B_Client_ID</audience> </audiences> </validate-jwt> </when> </choose> </inbound> </policies>
将 Azure Function 应用导入 API 管理服务后,如何查看/编辑添加生成的主机密钥授权调用的策略?
我已将 Azure Function 应用程序导入到 Azure API 管理服务中,该服务会自动在 Function 应用程序上生成一个主机密钥,用于授权对其进行调用。 我想检查一下...
我正在使用 APIM 来验证 JWT 令牌,这是我的策略外观 我正在使用 APIM 来验证 JWT 令牌,这是我的策略外观 <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid."> <audience>68f3930e-0492-4642-8cd0-65d68a504dba</audience> <audience>7a20a24d-1bc7-4906-8dfc-c0e6dfd19d69</audience> <audience>ae901aaf-6bea-4e1b-902c-6851e4305b1b</audience> <audience>0d5b8f5e-4045-459c-99f1-a710ca8dd63e</audience> <audience>c37587ed-2974-4932-b87f-e51886ca378e</audience> <audience>2f96ac72-7887-4aa4-a02c-204288fe1ed8</audience> <audience>7c5dd291-edd7-4dc4-ad09-25ac006a0a42</audience> </audiences> <issuers> <issuer>https://login.microsoftonline.com/{TenantId}/v2.0/</issuer> <issuer>https://{Tenant}.b2clogin.com/38cf84e1-4cbb-4abb-8aa3-4c0f7107c585/v2.0/</issuer> <issuer>https://sts.windows.net/{TennatId}/</issuer> </issuers> </validate-jwt> 我指定发行者,以便我可以验证 B2B 和 B2C JWT 令牌,并且还添加了受众,以便它可以验证多个应用程序生成的令牌。我没有指定 OpenId Config,因为在我的案例中指定了明确的颁发者。 我收到此错误 validate-jwt (-0.148 ms) { "message": "JWT Validation Failed: IDX10500: Signature validation failed. No security keys were provided to validate the signature.." } 我尝试指定这样的发行者密钥,我以这种方式得到 1- https://login.microsoftonline.com/{tenant_id}/discovery/keys?appid={client_id} 2- https://{Tenant}.b2clogin.com/{tenant}.onmicrosoft.com/B2C_1_si/discovery/v2.0/keys 我正在检索多个孩子,我在下面指定了这些孩子,但在保存“无效的 Base64 字符串”策略时出现错误 <issuer-signing-keys> <key>X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk</key> <key>Mr5-AUibfBii7Nd1jBebaxboXW0</key> </issuer-signing-keys> 请建议我在我的案例中做错了什么。 保存“无效 Base64 字符串”策略时出错 您可以将 Base64 格式的 <issuer-signing-keys> 键用作 <key>@(Convert.ToBase64String(Encoding.UTF8.GetBytes("signing-keys")))</key>,请参阅 SO thread。 但需要对称密钥来验证 A128CBC-HS256、A192CBC-HS384、A256CBC-HS512 算法,根据this ms docs。 我已使用以下策略使用 Azure AD 验证 jwt 令牌,而无需使用任何密钥。 <policies> <inbound> <base /> <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid." require-scheme="Bearer"> <openid-config url="https://login.microsoftonline.com/<tenant_id>/.well-known/openid-configuration" /> <audiences> <audience>xxxxxxxxxxxxxxxxxxxxxxxxxxx</audience> </audiences> <issuers> <issuer>https://sts.windows.net/{tenant_id}/</issuer> </issuers> </validate-jwt> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies> 输出 请参阅 SO Thread1 以验证多个发行者和受众。
Azure api 管理服务无法授权调用 Web 应用程序 API
我正在尝试使用托管在 Azure Web 应用程序中的一个后端 API 设置 Azure API 管理服务。 APIM 应该在服务主体的帮助下针对 Web 应用程序进行身份验证。 我
我正在实施一个 API 管理 (APIM) 解决方案来集成两个 Azure OpenAI 部署(PTU 和按次付费)。我的目标是有效管理代币使用并动态避免 429 错误
我开发了一个Azure功能,并希望使用send-request或set-backend-service策略将其集成到apim策略中。有人可以帮我实现这个目标吗? 我尝试了以下但我不是
如何更改 Azure API 管理服务中端点/操作的 Azure Functions 后端?
我正在开发我们已经使用多年的 Azure Functions 应用程序的新版本。该应用程序已经经历了多个版本。对于每个主要版本,遵循建议...
为什么 azure-openai-emit-token-metric 策略不捕获 GPT4o 流响应的令牌使用情况?
我正在开发一个检索增强生成 (RAG) 应用程序,该应用程序使用 Azure OpenAI GPT4o 进行两种类型的 API 调用: 重新表述问题(非流媒体通话) 生成响应(str...
我目前有以下策略,可根据上传到 API 管理的“任何”证书验证证书指纹: 我目前有以下策略,可根据上传到 API 管理的“任何”证书验证证书指纹: <choose> <when condition="@(context.Request.Certificate == null || !context.Deployment.Certificates.Any(c => c.Value.Thumbprint == context.Request.Certificate.Thumbprint))"> <return-response> <set-status code="403" reason="Invalid client certificate"/> </return-response> </when> </choose> 但我想根据上传到 API 管理的“特定”证书验证指纹,不是“任何”。 我已尝试以下政策: <choose> <when condition="@(context.Request.Certificate == null || context.Deployment.Certificates["MyCert"].Thumbprint == context.Request.Certificate.Thumbprint)"> <return-response> <set-status code="403" reason="Invalid client certificate"/> </return-response> </when> </choose> “MyCert”是API中“客户端证书”的“Id”,指的是Key Vault中上传的证书。 但是当我调用 API 时,它会抛出此错误: 表达式评估失败。字典中不存在给定的密钥“MyCert”。在 System.Collections.Immutable.ImmutableDictionary`2.get_Item(TKey key) 有人可以帮我解决这个问题吗? context.Deployment.Certificates.Values 不包含要过滤的证书 ID 参数。 您可以使用 <set-variable name="Values" value="@((string)string.Join(", ", context.Deployment.Certificates.Values))" /> 表达式来验证它。 您可以使用下面给出的策略来传递在 APIM 中上传的特定证书的指纹,以验证传入的证书。 <policies> <inbound> <base /> <choose> <when condition="@(context.Request.Certificate != null || (string)context.Deployment.Certificates.Values.FirstOrDefault(cert => cert.Thumbprint == "<APIMCertThumbprint>")?.Thumbprint == context.Request.Certificate.Thumbprint)"> <return-response> <set-status code="200" reason="OK" /> <set-body>Valid certificate</set-body> </return-response> </when> <otherwise> <return-response> <set-status code="403" reason="Invalid client certificate" /> <set-body>Invalid or missing client certificate</set-body> </return-response> </otherwise> </choose> </inbound> </policies> 由于某些限制,我无法传递请求正文中的证书信息,因此我通过将指纹值存储在 set-variable 中与 APIM 中上传的证书进行测试。
我目前正在尝试使用 Api 管理将调用重定向到特定端点,以便当有人访问我的端点时 https://ApiManagementResource.azure-api.net/auth/ParseState?state=Splited%
我目前在 apim 后面托管 serval api。我现在计划公开文档并希望以编程方式执行此操作,因此我的问题是: 是否有可能制定一个全球性的拦截政策
Azure APIM 策略中的 Newtonsoft.Json 转换
在 Azure APIM 策略中 - 响应可以作为 Json 对象或 Json 数组返回 - 但也可以是其中之一,并且这两种情况都需要处理。 这仅在响应时才有效...
目前在 APIM 中,我们有产品订阅密钥级别限制。但显然,如果我们在同一产品中有多个 API,则一个 API 可能会消耗更多配额 超出预期并防止其他...
我想在其中一个 api 中应用此策略,以将其收到的令牌重定向到 api https://obw.stdn.com.pe/api/mf/v3/ami/authorize 我想在其中一个 api 中应用此策略,以将其收到的令牌重定向到 api https://obw.stdn.com.pe/api/mf/v3/ami/authorize <policies> <inbound> <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid."> <openid-config url="https://uatidpbsp.b2clogin.com/uatidpbsp.onmicrosoft.com/B2C_1A_LOGIN_OOBB/v2.0/.well-known/openid-configuration" /> <audiences> <audience>01c396bf-e852-b396-d0a7e4d0d373</audience> <audience>c2ef0c9f-98f1-920e-44fb99c98026</audience> </audiences> <issuers> <issuer>https://uatidpbsp.b2clogin.com/a359g4c43-4228-563k5-89b6/v2.0/</issuer> </issuers> </validate-jwt> <!-- Send the request to the external endpoint with the token --> <send-request mode="new"> <set-url>https://obw.stdn.com.pe/api/mf/v3/ami/authorize</set-url> <set-method>POST</set-method> <set-header name="Authorization" exists-action="override"> <value>Bearer @(context.Request.Headers.GetValueOrDefault("Authorization", ""))</value> </set-header> <set-header name="Ocp-Apim-Subscription-Key" exists-action="override"> <value>e75ee8762a842htf96e36ba5f9z8c275</value> </set-header> <set-body> <value>{}</value> </set-body> </send-request> <base /> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies> 我收到以下错误: Some of the policy expressions may not have the correct parentheses or braces format. Please ensure that all policy expressions are in the correct format @() or @{}, in order to avoid any issues. 当我尝试保存策略时,出现语法错误。 发送请求策略需要进行两项修改: 需要响应变量 <send-request mode="new" response-variable-name="responseExternal"> 主体值的大括号必须被删除 <set-body><value /></set-body> 完整政策: <policies> <inbound> <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid."> <openid-config url="https://uatidpbsp.b2clogin.com/uatidpbsp.onmicrosoft.com/B2C_1A_LOGIN_OOBB/v2.0/.well-known/openid-configuration" /> <audiences> <audience>01c396bf-e852-b396-d0a7e4d0d373</audience> <audience>c2ef0c9f-98f1-920e-44fb99c98026</audience> </audiences> <issuers> <issuer>https://uatidpbsp.b2clogin.com/a359g4c43-4228-563k5-89b6/v2.0/</issuer> </issuers> </validate-jwt> <!-- Send the request to the external endpoint with the token --> <send-request mode="new" response-variable-name="responseExternal"> <set-url>https://obw.stdn.com.pe/api/mf/v3/ami/authorize</set-url> <set-method>POST</set-method> <set-header name="Authorization" exists-action="override"> <value>Bearer @(context.Request.Headers.GetValueOrDefault("Authorization", ""))</value> </set-header> <set-header name="Ocp-Apim-Subscription-Key" exists-action="override"> <value>e75ee8762a842htf96e36ba5f9z8c275</value> </set-header> <set-body> <value /> </set-body> </send-request> <base /> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
我有一个 api,假设有 100 个操作。我已经创建了开发者门户。我的要求是 100 次操作,用户 A 只能查看 GET 操作,用户 B 只能查看 PUT 和 POST
我在api管理实例中创建了一个api。我正在尝试测试门户中的 api。我观察到以下错误消息。启用跟踪后,我发现了此错误消息。我可以知道我怎样才能...
如何在 Azure API 管理开发人员门户中删除使用本地用户帐户登录的选项?那不是在登录页面上显示选择/用户名 - 密码表单,并且在当前
同时发布带有 bicep set-body 和 set-backend-service 的 apim 策略
我有以下二头肌模块: // 如果 set-backend-service 和 set-body 一起使用会失败 // var apiOperationPolicy = format(''' // // // 我有以下二头肌模块: // fails if set-backend-service and set-body are used together // var apiOperationPolicy = format(''' // <policies> // <inbound> // <base /> // <rewrite-uri template="/" /> // <set-backend-service base-url="{0}" /> // <set-body> // <value>@{ // var body = context.Request.Body.As<JObject>(); // body["source"] = body["operation"]; // return body.ToString(); // }</value> // </set-body> // </inbound> // <backend> // <base /> // </backend> // <outbound> // <base /> // </outbound> // <on-error> // <base /> // </on-error> // </policies> // ''', formattedBasePath) //works if only set-body // var apiOperationPolicy = ''' // <policies> // <inbound> // <base /> // <rewrite-uri template="/" /> // <set-body> // <value>@{ // var body = context.Request.Body.As<JObject>(); // body["source"] = body["operation"]; // return body.ToString(); // }</value> // </set-body> // </inbound> // <backend> // <base /> // </backend> // <outbound> // <base /> // </outbound> // <on-error> // <base /> // </on-error> // </policies> // ''' //works if only set-backend-service is used var apiOperationPolicy = format(''' <policies> <inbound> <base /> <rewrite-uri template="/" /> <set-backend-service base-url="{0}" /> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies> ''', formattedBasePath) resource apiOperationPolicyResource 'Microsoft.ApiManagement/service/apis/operations/policies@2022-04-01-preview' = { parent: apiOperation name: 'policy' properties: { value: apiOperationPolicy format: 'rawxml' } } 如果我尝试设置这两个策略,则会收到以下错误: 错误:InvalidTemplate - 部署模板验证失败:“模板变量“apiOperationPolicy”无效:无法评估语言函数“格式”:格式无效:“输入字符串的格式不正确。” 有谁知道这是什么原因吗? 错误:InvalidTemplate - 部署模板验证失败:“模板变量“apiOperationPolicy”无效:无法评估语言函数“格式”:格式无效:“输入字符串的格式不正确。” 我之前在我的环境中尝试时也收到了同样的错误。我使用以下解决方法来解决该问题并按预期工作。 基本上,您使用的占位符的目的是。部署后,它将被格式化的基本路径 URL 替换。因此,不要使用 {0} 作为占位符,而是尝试使用名为 _base_url_ 的占位符来避免输入格式的冲突,因为当 bicep 读取 XML 的多行结构时,有可能出现解析错误。 通过 _base_url_ 后,使用策略中可用的 replace() 函数将占位符替换为存储在格式化基本路径中的实际 URL。 param formattedBasePath string = 'https://google.com' var apiOperationPolicy = ''' <policies> <inbound> <base /> <rewrite-uri template="/" /> <set-backend-service base-url="_base_url_" /> <set-body> <value>@{ var body = context.Request.Body.As<JObject>(); body["source"] = body["operation"]; return body.ToString(); }</value> </set-body> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies> ''' 使用replace()函数: var replacepolicy = replace(apiOperationPolicy, '_base_url_', formattedBasePath) resource apiManagementService 'Microsoft.ApiManagement/service@2023-05-01-preview' existing = { name: 'newapimjah' } resource api 'Microsoft.ApiManagement/service/apis@2020-12-01' existing = { parent: apiManagementService name:'apinewjah' } resource apiOperation 'Microsoft.ApiManagement/service/apis/operations@2023-09-01-preview' existing = { name: 'firstop' parent: api } resource apiOperationPolicyResource 'Microsoft.ApiManagement/service/apis/operations/policies@2022-04-01-preview' = { parent: apiOperation name: 'policy' properties: { value: replacepolicy format: 'rawxml' } } 部署成功:
我将介绍通过 Azure API 管理器公开 API 子集的方法以及如何保证安全。目的是让合作伙伴构建自己的连接到这些 API 的应用程序。 对...