如何使Azure API管理(API网关)CORS策略动态化?

y53ybaqx  于 2022-11-17  发布在  其他
关注(0)|答案(3)|浏览(141)

我想在Azure API网关的allowed-origins部分动态添加域(Origins)。是否可以?或者是否有其他方法可以设置CORS,以便我们可以动态允许origins。

<cors>
        <allowed-origins>
            <origin>http://www.example.com</origin>
        </allowed-origins>
        <allowed-methods>
            <method>GET</method>
            <method>POST</method>
        </allowed-methods>
    </cors>
lnvxswe2

lnvxswe21#

您不能动态地将元素添加到策略配置中,但可以动态地为其提供值(https://learn.microsoft.com/en-us/azure/api-management/api-management-policy-expressions):

<cors>
    <allowed-origins>
        <origin>@(context.Request.Url.ToUri().GetLeftPart(UriPartial.Authority))</origin>
    </allowed-origins>
    <allowed-methods>
        <method>GET</method>
        <method>POST</method>
    </allowed-methods>
</cors>
bxgwgixi

bxgwgixi2#

我发现上面的解决方案不适用于预检OPTIONS请求,因为只有CORS策略被评估,导致它试图评估未分配的变量。
我通过创造(在此范例中为2)具名值,包含以逗号分隔的URL清单。“具名值”在原则评估时可用,因此可以运作。多个清单的理由是具名值的大小限制为4096个字符(我在这里的来源是Azure门户中输入过大值时的错误消息),这并不是很多URL。我选择使用CSV而不是JSON数组作为Named Values中的数据结构,因为处理JSON时会增加开销。我在本地运行了一些基准测试和CSV列表的连接,在较低的内存分配和GC的情况下,速度大约快了3倍。

<cors>
        <allowed-origins>
            <origin>@{
                string[] stringArray = new string[] { {{corslistcsv0}}, {{corslistcsv1}} };
                string origin = context.Request.Headers.GetValueOrDefault("Origin", "");
                int urlIndex = -1;
                urlIndex = Array.IndexOf(stringArray, origin);
                return urlIndex == -1 ? "https://urlthaticontrol.org" : origin;
            }</origin>
        </allowed-origins>
    </cors>

以下是命名值中的示例列表:

"https://url1.com","http://url2.net","http://url3.org"
8yoxcaq7

8yoxcaq73#

我找到了一种提到贝娄的方式。

<inbound>
    <base />
    <send-request mode="new" response-variable-name="variable" timeout="600" ignore-error="true">
        <set-url>@("http://MyDomain/ApiMethod?Origin="(string)context.Request.Headers["Origin"].Last())</set-url>
        <set-method>GET</set-method>
        <set-body />
    </send-request>
    <cors>
        <allowed-origins>
            <origin>@((string)((IResponse)context.Variables["variable"]).Body.As<JObject>(true)["Origin"])</origin>
        </allowed-origins>
        <allowed-methods>
            <method>GET</method>
            <method>POST</method>
        </allowed-methods>
    </cors>
</inbound
  • 首先调用一个API,该API将Origin作为查询参数。
  • 将响应存储在变量参数中。
  • API返回Json对象,例如:{“原产地”:“http://www.example.com“}
  • 从响应中检索OriginValue.并将其赋值给<origin></origin>

相关问题