首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ASP.Net MVC中设置访问控制-允许-原点-最简单的方法

在ASP.Net MVC中设置访问控制-允许-原点-最简单的方法
EN

Stack Overflow用户
提问于 2011-06-09 16:29:19
回答 11查看 170.1K关注 0票数 216

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

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

代码语言:javascript
复制
Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.

我知道有两种方法可以解决这个问题:JSONP和创建一个custom HttpHandler来设置头部。

没有更简单的方法了吗?

难道一个简单的操作就不能定义一个允许的起源列表--或者简单地允许每个人吗?也许是一个动作过滤器?

最佳方案是……:

代码语言:javascript
复制
return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-06-09 17:00:12

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

创建新属性

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

标记您的操作:

代码语言:javascript
复制
[AllowCrossSiteJson]
public ActionResult YourMethod()
{
    return Json("Works better?");
}

对于ASP.NET网络应用编程接口

代码语言:javascript
复制
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控制器:

代码语言:javascript
复制
[AllowCrossSiteJson]
public class ValuesController : ApiController
{

或单独的API调用:

代码语言:javascript
复制
[AllowCrossSiteJson]
public IEnumerable<PartViewModel> Get()
{
    ...
}

对于Internet Explorer <= v9

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

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

Blog post | Source code

票数 402
EN

Stack Overflow用户

发布于 2012-07-16 01:08:43

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

代码语言:javascript
复制
<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

票数 125
EN

Stack Overflow用户

发布于 2013-09-07 16:30:27

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

基于@jgauffin的答案,我创建了这个,这基本上是一种绕过特定浏览器安全检查的方法,所以请注意抢购者。

代码语言:javascript
复制
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);
    }
}
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6290053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档