Azure功能:CORS:如何支持;“访问控制允许凭据”;标题和选项飞行前? 编辑

Azure功能:CORS:如何支持;“访问控制允许凭据”;标题和选项飞行前? 编辑,cors,azure-functions,preflight,Cors,Azure Functions,Preflight,因为StackOverflow不喜欢你删除东西。这是我自己的愚蠢 我学到的是: “选项”方法当前似乎不适用于Azure 在本地运行Azure函数时使用Cli函数。 Azure支持选项请求上的Azure功能非常好。当你们搞砸了,并且在通过代理进行手动测试时,在请求主机中有错误的头时,他们就是不理解 我有一个Azure函数,它需要cookies来携带会话细节。因此,我需要将标题“访问控制允许凭据”设置为true 详情如下: 如果您通过删除所有CORS URL来禁用功能应用程序的默认“应

因为StackOverflow不喜欢你删除东西。这是我自己的愚蠢

我学到的是:

  • “选项”方法当前似乎不适用于Azure 在本地运行Azure函数时使用Cli函数。
  • Azure支持选项请求上的Azure功能非常好。当你们搞砸了,并且在通过代理进行手动测试时,在请求主机中有错误的头时,他们就是不理解

我有一个Azure函数,它需要cookies来携带会话细节。因此,我需要将标题“访问控制允许凭据”设置为true

详情如下:

如果您通过删除所有CORS URL来禁用功能应用程序的默认“应用程序服务”CORS设置,则将允许您设置CORS相关的头,例如“访问控制允许凭据”。这个很好用

但是,禁用CORS设置后,需要手动处理所有CORS功能。问题是Azure函数似乎不允许您在定义函数时使用选项动词。因此,似乎没有办法处理CORS的飞行前请求

有什么推荐的解决方法吗

仅供参考,这是我的function.json:

{
  "disabled":false,
  "bindings":[
    {
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "authLevel": "anonymous",
      "methods": [ "OPTIONS" ],
      "route": "1.0/myFunction"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    }
  ]
}
代码如下:

'use strict';

module.exports = function(context, req){
    var shared = require('../auth-shared-libraries');
    var cors_url = shared.getCORSUrl(context);
    context.res = {
        status: 200,
        headers: {
            "Access-Control-Allow-Credentials" : "true",
            "Access-Control-Allow-Origin" : cors_url,
            "Access-Control-Allow-Methods" : "POST, OPTIONS",
            "Access-Control-Allow-Headers" : "Content-Type, Set-Cookie",
            "Access-Control-Max-Age" : "86400",
            "Vary" : "Accept-Encoding, Origin",
            "Content-Type" : "application/json"
        },
        body : JSON.stringify(req)
    };
    context.done();
}
这是发送给它的请求示例:

OPTIONS /api/1.0/myFunction HTTP/1.1
Host: localhost:7071
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Access-Control-Request-Method: POST
Origin: http://localhost:9000
Connection: close
这是我在Azure上运行Azure函数时得到的响应:

HTTP/1.1 404 Site Not Found
Content-Type: text/html
Server: Microsoft-IIS/8.0
Date: Tue, 14 Feb 2017 01:57:14 GMT
Connection: close
Content-Length: 5147

<!DOCTYPE html>
<html>
<head>
    <title>Microsoft Azure Web App - Error 404</title>
    <style type="text/css">
        html {
            height: 100%;
            width: 100%;
        }

        #feature {
            width: 960px;
            margin: 75px auto 0 auto;
            overflow: auto;
        }

        #content {
            font-family: "Segoe UI";
            font-weight: normal;
            font-size: 22px;
            color: #ffffff;
            float: left;
            width: 460px;
            margin-top: 68px;
            margin-left: 0px;
            vertical-align: middle;
        }

            #content h1 {
                font-family: "Segoe UI Light";
                color: #ffffff;
                font-weight: normal;
                font-size: 60px;
                line-height: 48pt;
                width: 800px;
            }

        p a, p a:visited, p a:active, p a:hover {
            color: #ffffff;
        }

        #content a.button {
            background: #0DBCF2;
            border: 1px solid #FFFFFF;
            color: #FFFFFF;
            display: inline-block;
            font-family: Segoe UI;
            font-size: 24px;
            line-height: 46px;
            margin-top: 10px;
            padding: 0 15px 3px;
            text-decoration: none;
        }

            #content a.button img {
                float: right;
                padding: 10px 0 0 15px;
            }

            #content a.button:hover {
                background: #1C75BC;
            }        
    </style>
    <script type="text/javascript">
        function toggle_visibility(id) {
            var e = document.getElementById(id);
            if (e.style.display == 'block')
                e.style.display = 'none';
            else
                e.style.display = 'block';
        }
    </script>
</head>
<body bgcolor="#00abec">
    <div id="feature">
        <div id="content">
            <h1>Error 404 - Web app not found.</h1>
            <p>The web app you have attempted to reach is not available in this Microsoft Azure App Service region. This could be due to one of several reasons:
            <p>
                1. The web app owner has registered a custom domain to point to the Microsoft Azure App Service, but has not yet configured Azure to recognize it. <a href="#" onclick="toggle_visibility('moreone');">Click here to read more</a></abbr>.
                <div id="moreone" style="display:none">
                    <font size=2>
                      When an app owner wants to use a custom domain with a <a href="http://www.windowsazure.com/en-us/services/web-sites/">Microsoft Azure Web Apps</a> web app, Azure needs to be configured to recognize the custom domain name, so that it can route the request to the appropriate server in the region. After registering the domain with a domain provider and configuring a DNS CNAME record to point to the app&#39;s Azurewebsites.net address (for example, contoso.azurewebsites.net), the web app owner also needs to go to the Azure Portal and configure the app for the new domain. <a href="http://www.windowsazure.com/en-us/documentation/articles/web-sites-custom-domain-name/">Click here</a> to learn more about configuring the custom domains for a web app.
                     </font>
</div>
        <p>
          2. The web app owner has moved the web app to a different region, but the DNS cache is still directing to the old IP Address that was used in the previous region. <a href="#" onclick="toggle_visibility('moretwo');">Click here to read more.</a>
            <div id="moretwo" style="display:none">
                <font size=2>
                    With <a href="http://www.windowsazure.com/en-us/services/web-sites/">Web Apps</a>, the app is stored in a datacenter located in the region that the web app owner has selected when creating the app, and Azure�s DNS server resolves the web app address that was chosen for it to that datacenter. DNS servers are in charge of resolving the name of the server the user is trying to reach into an IP address, but clients cache this information in order to be able to load the page as fast as possible. If this app was deleted and re-created in another region, the new app will have a different IP address, but the client might still be caching the old IP address.

                    First, try clearing the cache on your client <a href="http://technet.microsoft.com/en-us/library/cc781949(v=ws.10).aspx">as described here</a>. If this does not help, this is probably due to the caching done on an intermediate DNS server such as the one used by your Internet Service Provider. If so, this issue should clear up soon, once the DNS cache reaches its time-to-live period. Please try to visit the app again in approximately one hour. If you continue to receive this error page, please contact <a href="http://www.windowsazure.com/en-us/support/options/">Microsoft support</a>.
                    </font>
            </div>
        </div>
     </div>
</body>
</html>

我在使用选项动词时没有问题

能否确保function.json在“methods”数组中包含“options”,如下所示:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": ["get", "post", "options"]
    }
  ]
}

或者,您可以完全删除“methods”数组并允许所有方法。

如果在本地运行时遇到问题,请添加:

  "Host": {
    "CORS": "*"
  }

到local.settings.json

我不知道您为什么对此没有问题。我只是再次重试了所有操作,当部署到Azure的选项时,我仍然会得到一个404错误,当使用Azure函数Cli“func run myFunction”时,仍然会得到一个400错误。我已经发布了更多的细节。让我收回这一点。向Azure发送请求时,我没有更新我的“主机”标题。看起来选项确实在Azure上起作用,只是Azure功能失败了。我认为这只是在本地开发时才需要的。对于实际生产,不需要在函数中添加选项方法,而是正确定义CORS;它应该会起作用。将选项设置为本地测试时直接调用函数的方法;不过,我对产品不太确定。谢谢,我在本地运行azure功能时遇到了问题,因为chrome会发出选项请求,寻找失败的COR。这就是解决问题所需要的全部。
  "Host": {
    "CORS": "*"
  }