CORS 不工作 ASP.Net MVC5

Posted

技术标签:

【中文标题】CORS 不工作 ASP.Net MVC5【英文标题】:CORS not working ASP.Net MVC5 【发布时间】:2018-09-28 01:41:29 【问题描述】:

我正在尝试使用 CORS 阻止对我的资源的跨域访问。我也尝试过WebApi.Cors 和自定义ActionFilter。但我仍然能够从不允许的域访问数据。

我的ActionFilter 代码如下

public class AllowCrossSiteAttribute : ActionFilterAttribute
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Credentials", "true");
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "https://example.com");
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Headers", "*");
            base.OnActionExecuting(filterContext);
        

我的控制器

    [HttpGet]
    [AllowCrossSite]
    public ActionResult Index(string username)
    
      //return json data
    

这些标头存在于响应标头中,但是为什么请求没有阻止来自其他域的请求,我做错了什么?请帮忙

【问题讨论】:

【参考方案1】:

添加响应标头实际上不会提供任何类型的安全性。常规 cors 实现仅添加那些响应标头以通知客户端已应用的 cors 规则。

服务器上的某些东西需要将您的 cors 规则与请求的 origin / method 等标头进行比较,如果它们不匹配,则发回 4XX 响应。

NuGet 包Microsoft.AspNet.WebApi.Cors 允许您执行以下操作:

[EnableCors(origins: "https://example.com")]

如果您更喜欢自己的自定义实现,您可以在github 上查看此属性的源代码。这应该让您对手工制作 cors 需要做什么有一个相当好的了解。它比看起来简单,真的。

【讨论】:

感谢您的回答,我们有什么办法可以防止GET 上的CSRF 跨站请求伪造?我仍然可以使用所需的headersGET 请求伪造请求并获取数据。 是的,带有授权标头和访问令牌验证。 IdentityServer3/4 是解决此问题的首选解决方案。在这方面,仅 CORS 并不是一个足够的安全机制,它只是第一道防线。 非常感谢您抽出宝贵时间,非常感谢。感谢您为我指明了正确的方向。

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

Asp.Net Core WebAPI CORS 不工作

ASP.NET 5:Azure Web 应用 CORS 在延迟后停止工作

根据官方文档,Asp.net Core 3.0 CORS 无法正常工作

ASP.NET Core Cors 已启用但无法正常工作

是否有特定的 asp.net 核心配置让 CORS 与多个 API 一起工作

使集成的安全性和 CORS 与 Asp.Net、Angular 6 和 IIS 一起工作