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

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

如果我尝试打电话,我会得到预期的…:

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

我知道有两种方法来解决这个问题: JSONP并创build一个自定义的HttpHandler来设置标题。

有没有简单的方法?

一个简单的行动不可能定义一个允许的来源列表 – 或简单地允许每个人? 也许一个行动filter?

最佳将是…:

 return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe); 

对于普通的ASP.NET MVC控制器

创build一个新的属性

 public class AllowCrossSiteJsonAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*"); base.OnActionExecuting(filterContext); } } 

标记你的动作:

 [AllowCrossSiteJson] public ActionResult YourMethod() { return Json("Works better?"); } 

对于ASP.NET Web API

 using System; using System.Web.Http.Filters; public class AllowCrossSiteJsonAttribute : ActionFilterAttribute { public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { if (actionExecutedContext.Response != null) actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*"); base.OnActionExecuted(actionExecutedContext); } } 

标记整个API控制器:

 [AllowCrossSiteJson] public class ValuesController : ApiController { 

或个别API调用:

 [AllowCrossSiteJson] public IEnumerable<PartViewModel> Get() { ... } 

对于Internet Explorer <= v9

IE <= 9不支持CORS。 我写了一个JavaScript,将自动路由这些请求通过代理。 这都是100%透明(你只需要包括我的代理和脚本)。

使用nuget corsproxy下载并按照附带的说明操作。

博客文章 | 源代码

如果您使用的是IIS 7+,则可以在system.webServer部分中将web.config文件放置到文件夹的根目录中:

 <httpProtocol> <customHeaders> <clear /> <add name="Access-Control-Allow-Origin" value="*" /> </customHeaders> </httpProtocol> 

请参阅: http : //msdn.microsoft.com/en-us/library/ms178685.aspx和: http : //enable-cors.org/#how-iis7

我遇到了一个问题,浏览器拒绝提供它在cookie中传递的请求(例如,xhr的withCredentials=true )时检索到的内容,并且该站点将Access-Control-Allow-Origin设置为* 。 (Chrome中的错误是“当凭证标志为真时,不能在Access-Control-Allow-Origin中使用通配符”)。

基于@jgauffin的答案,我创build了这个,这基本上是一种解决特定的浏览器安全检查的方法,所以要注意空置。

 public class AllowCrossSiteJsonAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { // We'd normally just use "*" for the allow-origin header, // but Chrome (and perhaps others) won't allow you to use authentication if // the header is set to "*". // TODO: Check elsewhere to see if the origin is actually on the list of trusted domains. var ctx = filterContext.RequestContext.HttpContext; var origin = ctx.Request.Headers["Origin"]; var allowOrigin = !string.IsNullOrWhiteSpace(origin) ? origin : "*"; ctx.Response.AddHeader("Access-Control-Allow-Origin", allowOrigin); ctx.Response.AddHeader("Access-Control-Allow-Headers", "*"); ctx.Response.AddHeader("Access-Control-Allow-Credentials", "true"); base.OnActionExecuting(filterContext); } } 

这很简单,只需在web.config中添加即可

 <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="http://localhost" /> <add name="Access-Control-Allow-Headers" value="X-AspNet-Version,X-Powered-By,Date,Server,Accept,Accept-Encoding,Accept-Language,Cache-Control,Connection,Content-Length,Content-Type,Host,Origin,Pragma,Referer,User-Agent" /> <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" /> <add name="Access-Control-Max-Age" value="1000" /> </customHeaders> </httpProtocol> </system.webServer> 

在Origin中,把所有可以访问你的web服务器的域放到头文件中,把所有的ajax http请求可以使用的所有可能的头文件放在方法里,把你允许的所有方法

问候 :)

WebAPI 2现在有一个CORS包,可以使用以下方式进行安装: Install-Package Microsoft.AspNet.WebApi.Cors -pre -project WebServic

安装完成后,请按照以下代码进行操作: http : //www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

有时OPTIONS动词也会导致问题

简单地说:用下面的方法更新你的web.config

 <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" /> </customHeaders> </httpProtocol> </system.webServer> 

并用httpGet和httpOptions更新webservice / controller头

 // GET api/Master/Sync/?version=12121 [HttpGet][HttpOptions] public dynamic Sync(string version) { 

将此行添加到您的方法中,如果您使用的是API。

 HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 

本教程非常有用。 快速总结一下:

  1. 使用Nuget上提供的CORS软件包: Install-Package Microsoft.AspNet.WebApi.Cors

  2. 在您的WebApiConfig.cs文件中,将config.EnableCors()添加到Register()方法。

  3. 添加一个属性到你需要处理的控制器:

[EnableCors(origins: "<origin address in here>", headers: "*", methods: "*")]

  public ActionResult ActionName(string ReqParam1, string ReqParam2, string ReqParam3, string ReqParam4) { this.ControllerContext.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin","*"); /* --Your code goes here -- */ return Json(new { ReturnData= "Data to be returned", Success=true }, JsonRequestBehavior.AllowGet); }