Ustawianie Access-Control-Allow-Origin w ASP.Net MVC-najprostsza możliwa metoda

Mam prosty actionmethod, który zwraca jakiś json. Działa na ajax.example.com. muszę uzyskać dostęp do tego z innej strony someothersite.com.

Jeśli próbuję to nazwać, dostaję oczekiwane...:
Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.

Znam dwa sposoby na obejście tego: JSONP i stworzenie własnego Httphandlera do Ustaw nagłówek.

Nie ma prostszego sposobu?

Czy nie jest możliwe, aby prosta akcja zdefiniowała listę dozwolonych początków-lub proste Zezwolenie wszyscy? Może filtr akcji?

Optymalne byłoby...:

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
Author: Community, 2011-06-09

10 answers

Dla zwykłego ASP.NET Kontrolery MVC

Utwórz nowy atrybut

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

Oznacz swoją akcję:

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

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

Oznacz cały kontroler API:

[AllowCrossSiteJson]
public class ValuesController : ApiController
{

Lub pojedyncze wywołania API:

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

Dla Internet Explorera

IE

Pobierz go za pomocą nuget corsproxy i postępuj zgodnie z dołączonymi instrukcjami.

Wpis na blogu | Kod źródłowy

 340
Author: jgauffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-02 20:35:59

Jeśli używasz IIS 7+, możesz umieścić sieć.plik konfiguracyjny do katalogu głównego z tym w systemie.sekcja webServer:

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

Zobacz: http://msdn.microsoft.com/en-us/library/ms178685.aspx Oraz: http://enable-cors.org/#how-iis7

 107
Author: LaundroMatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-15 17:08:42

Napotkałem problem, w którym przeglądarka odmówiła podania treści, które pobrała, gdy żądanie przekazało pliki cookie (np. xhr miał swoją withCredentials=true), a strona miała Access-Control-Allow-Origin ustawioną na *. (Błąd w Chrome brzmiał: "Nie Można używać symboli wieloznacznych w Access-Control-Allow-Origin, gdy flaga poświadczeń jest prawdziwa.")

Bazując na odpowiedzi od @jgauffin, stworzyłem to, co jest w zasadzie sposobem obejścia tego konkretnego sprawdzenia bezpieczeństwa przeglądarki, więc proszę o zastrzeżenie emptor.

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);
    }
}
 19
Author: Ken Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-07 08:30:26

To naprawdę proste, wystarczy dodać to w sieci.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>

W Origin umieść wszystkie domeny, które mają dostęp do twojego serwera www, w nagłówkach umieść wszystkie możliwe nagłówki, których może użyć dowolne żądanie HTTP ajax, w methods umieść wszystkie metody, które zezwalasz na swoim serwerze

Pozdrawiam :) [2]}
 13
Author: Zvonimir Tokic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-11 09:54:21

Czasami czasownik OPTIONS również powoduje problemy

Po prostu: Zaktualizuj swoją sieć.config z następującym

<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>
W przeciwieństwie do innych aplikacji, webservice nie jest w stanie obsługiwać plików cookie.]}
// GET api/Master/Sync/?version=12121
        [HttpGet][HttpOptions]
        public dynamic Sync(string version) 
        {
 9
Author: Bishoy Hanna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-20 11:15:00

WebAPI 2 ma teraz pakiet dla CORS, który można zainstalować za pomocą : Install-Pakiet Microsoft.AspNet.WebApi.Cors-Pre-project WebServic

Po zainstalowaniu, wykonaj to dla kodu: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

 7
Author: Tarun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-12 13:33:17

Dodaj tę linię do swojej metody, jeśli używasz API.

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
 3
Author: Gopichandar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-14 11:10:25

Ten samouczek jest bardzo przydatny. Aby dać krótkie podsumowanie:

  1. Skorzystaj z pakietu CORS dostępnego na Nuget: Install-Package Microsoft.AspNet.WebApi.Cors

  2. W pliku WebApiConfig.cs dodaj config.EnableCors() do metody Register().

  3. Dodaj atrybut do kontrolerów, które mają obsługiwać cors:

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

 3
Author: GrandMasterFlush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-11 10:47:02
    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);
    }
 1
Author: Pranav Labhe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-04 11:46:24

W Sieci.config wpisz następujące

<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>
 0
Author: Elvis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-27 09:17:54