ASP .NET MVC5 中的 CORS

Posted

技术标签:

【中文标题】ASP .NET MVC5 中的 CORS【英文标题】:CORS in ASP .NET MVC5 【发布时间】:2015-01-28 20:37:12 【问题描述】:

我有一个 MVC 项目,其中有几个我想公开跨域的 JSON 控制器方法。不是整个网站,只有这两种方法。

我基本上想要这篇文章中关于 cors 的确切内容:

http://enable-cors.org/server_aspnet.html

但是,问题是我有一个常规的 MVC 项目,而不是一个 WEB API,这意味着我无法按照注册的步骤进行操作

public static void Register(HttpConfiguration config)

    // New code
    config.EnableCors();

方法,因为它不在我的 MVC 项目中。

虽然它是一个 MVC 项目,但有没有办法使用这个库?

我知道我可以通过 web.config 使用:

<httpProtocol>
      <customHeaders>
        <clear />
        <add name="Access-Control-Allow-Origin" value="http://www.domain.com" />
      </customHeaders>
</httpProtocol>

但我不想公开所有方法,我想指定多个域(2 个域)来访问我的方法...

【问题讨论】:

Setting Access-Control-Allow-Origin in ASP.Net MVC - simplest possible method的可能重复 是的,我已经看到了,但这基本上与添加 唯一的问题是我想声明 2 个可以访问我的 json 服务的域,而不仅仅是所有 () 或 1 个特定的.... 【参考方案1】:

如此处所述:Setting Access-Control-Allow-Origin in ASP.Net MVC - simplest possible method

您应该只创建一个操作过滤器并在那里设置标题。您可以在任何您想要的操作方法上使用此操作过滤器。

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    
        filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        base.OnActionExecuting(filterContext);
    

如果你想添加多个域,你不能只是多次设置标题。在您的操作过滤器中,您需要检查请求域是否来自您的域列表,然后设置标题。

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    
        var domains = new List<string> "domain2.com", "domain1.com";

        if (domains.Contains(filterContext.RequestContext.HttpContext.Request.UrlReferrer.Host))
        
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        

        base.OnActionExecuting(filterContext);
    

【讨论】:

Tjis 很有用,因为这样我就可以将它限制为仅用于我想要公开的方法,但是,我想允许两个不同的域..不是全部 (*) 而不仅仅是一个 (www.domain .com) 我可以为来源添加多个标题吗?例如:filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allo‌​w-Origin", "domain1.com"); filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allo‌​w-Origin", "domain2.com"); @user4309587 你不能从Request 获取域然后有条件地添加正确的标头值吗? 很好的答案!非常感谢你……我的代表不允许我给你投票……:( 这样进行域检查... if (!String.IsNullOrEmpty(domains.FirstOrDefault(s => s.Contains(filterContext.RequestContext.HttpContext.Request.UrlReferrer.Host)))) / /(filterContext.RequestContext.HttpContext.Request.UrlReferrer.Host)) 不适用于 Chrome/Firefox 获得 302... 见 ***.com/questions/35309831/…

以上是关于ASP .NET MVC5 中的 CORS的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MVC5 RedirectResult () 重定向到 Asp.net 中的整页?

如何使用trackerenableddbcontext在asp.net mvc5和代码中的实体框架中实现审计跟踪

保存数据库控制器类 asp.net mvc5 身份中的更改

Entity Framework的学习(ASP.NET MVC5的学习中的一部分)

ASP.Net 3.5 中的 CORS

ASP.NET MVC5 之 AspNetUsers 表增加字段