Настройка Access-Control-Allow-Origin in ASP.Net MVC-самый простой из возможных методов


у меня есть простой actionmethod, который возвращает некоторые json. Он работает дальше ajax.example.com. мне нужно получить доступ к этому с другого сайта someothersite.com.

Если я попытаюсь вызвать его, я получаю ожидаемое...:

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

Я знаю два способа обойти это: JSONP создание пользовательский HttpHandler to задать заголовок.

нет ли более простого способа?

не может ли простое действие либо определить список разрешенное происхождение-или просто разрешить всем? Может быть, фильтр действий?

оптимальным было бы...:

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
10 181

10 ответов:

для равнины ASP.NET контроллеры MVC

создать новый атрибут

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

IE

загрузите его с помощью nuget corsproxy и следуйте инструкциям по.

сообщение в блоге/исходный код

Если вы используете IIS 7+, Вы можете разместить веб.конфигурационный файл в корень папки с этим в системе.раздел веб-сервера:

<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

я столкнулся с проблемой, когда браузер отказался обслуживать контент, который он получил, когда запрос прошел в cookies (например, xhr имел свой withCredentials=true) и Access-Control-Allow-Origin значение *. (Ошибка в Chrome была: "невозможно использовать подстановочный знак в Access-Control-Allow-Origin, когда флаг учетных данных имеет значение true.")

основываясь на ответе от @jgauffin, я создал это, что в основном является способом обойти эту конкретную проверку безопасности браузера, поэтому будьте осторожны покупатель.

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);
    }
}

Это очень просто , просто добавьте это в интернете.конфигурации

<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 поместите все домены, которые имеют доступ к вашему веб-серверу, в заголовки помещаются все возможные заголовки, которые может использовать любой http-запрос ajax, в методы поместите все методы, которые вы разрешаете на вашем сервере

привет :)

иногда глагол опций также вызывает проблемы

просто: Обновите свой веб-сайт.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>

и обновите заголовки webservice / controller с помощью httpGet и httpOptions

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

WebAPI 2 теперь имеет пакет для CORS, который может быть установлен с помощью : Установить Пакет Microsoft.сеть САШ.Веб-API.Cors-предпроектный WebServic

Как только это будет установлено, следуйте этому для кода :http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

добавьте эту строку в свой метод, Если вы используете API.

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

в этом уроке очень полезно. Чтобы дать краткое резюме:

  1. используйте пакет CORS, доступный на Nuget:Install-Package Microsoft.AspNet.WebApi.Cors

  2. в своем добавьте config.EnableCors() до Register() метод.

  3. добавьте атрибут к контроллерам, которые вам нужны для обработки cors:

[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);
    }

В Интернете.конфигурация введите следующее

<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>