在ASP.Net MVC中设置Access-Control-Allow-Origin——最简单的方法

222

我有一个简单的Action方法,返回一些JSON。它在ajax.example.com上运行。我需要从另一个站点someothersite.com访问它。

如果我尝试调用它,我会得到预期的结果...

Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.

我知道两种解决此问题的方法:JSONP和创建一个自定义HttpHandler来设置标头。

难道没有更简单的方式吗?

是否不可能让一个简单的操作来定义允许的来源列表 - 或者简单地允许每个人?也许是一个操作过滤器?

最好的情况是...:

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
15个回答

2
有不同的方式可以传递Access-Control-Expose-Headers。
1. 如jgauffin所解释的,我们可以创建一个新属性。 2. 如LaundroMatt所解释的,我们可以在web.config文件中添加。 3. 另一种方法是我们可以在webApiconfig.cs文件中添加以下代码: config.EnableCors(new EnableCorsAttribute("", headers: "", methods: "*",exposedHeaders: "TestHeaderToExpose") { SupportsCredentials = true });
或者我们可以在Global.Asax文件中添加以下代码。
protected void Application_BeginRequest()
        {
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                //These headers are handling the "pre-flight" OPTIONS call sent by the browser
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
                HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "TestHeaderToExpose");
                HttpContext.Current.Response.End();
            }
        }

我已经为选项编写了代码,请根据您的需要进行修改。

愉快的编码!


1
我正在使用DotNet Core MVC,在与NuGet包、Startup.cs、属性和这个地方搏斗了几个小时后,我只是将以下内容添加到MVC操作中:
Response.Headers.Add("Access-Control-Allow-Origin", "*");

我知道这很笨重,但这正是我所需要的,而且没有其他内容想要添加这些头信息。我希望这可以帮助其他人!


0
如果您使用IIS,我建议尝试IIS CORS模块
它易于配置,并适用于所有类型的控制器。
以下是一个配置示例:
    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add origin="*" />
            <add origin="https://*.microsoft.com"
                 allowCredentials="true"
                 maxAge="120"> 
                <allowHeaders allowAllRequestedHeaders="true">
                    <add header="header1" />
                    <add header="header2" />
                </allowHeaders>
                <allowMethods>
                     <add method="DELETE" />
                </allowMethods>
                <exposeHeaders>
                    <add header="header1" />
                    <add header="header2" />
                </exposeHeaders>
            </add>
            <add origin="http://*" allowed="false" />
        </cors>
    </system.webServer>

0
在 Web.config 文件中输入以下内容:
<system.webServer>
<httpProtocol>
  <customHeaders>
    <clear />     
    <add name="Access-Control-Allow-Credentials" value="true" />
    <add name="Access-Control-Allow-Origin" value="http://localhost:123456(etc)" />
  </customHeaders>
</httpProtocol>

0

为了使MVC 5的主要答案起作用。

请使用System.Web.Mvc而不是System.Web.Http.Filters

using System;
using System.Web.Mvc;
// using System.Web.Http.Filters;

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
   ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接