web-dev-qa-db-ger.com

Festlegen von Access-Control-Allow-Origin in ASP.Net-MVC - einfachste Methode

Ich habe eine einfache Actionmethode, die etwas Json zurückgibt. Es läuft auf ajax.example.com. Ich muss darauf von einer anderen Seite someothersite.com zugreifen.

Wenn ich versuche, es anzurufen, bekomme ich die erwarteten ...:

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

Ich kenne zwei Möglichkeiten, um dieses Problem zu umgehen: JSONP und das Erstellen eines benutzerdefinierten HttpHandler to Setze den Header.

Gibt es keinen einfacheren Weg?

Ist es nicht möglich, mit einer einfachen Aktion entweder eine Liste zulässiger Herkunft zu definieren - oder einfach allen zuzulassen? Vielleicht ein Aktionsfilter?

Optimal wäre ...:

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
190
Kjensen

Für einfache ASP.NET-MVC-Controller

Erstellen Sie ein neues Attribut

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

Kennzeichnen Sie Ihre Aktion:

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

Für 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);
    }
}

Markieren Sie einen ganzen API-Controller:

[AllowCrossSiteJson]
public class ValuesController : ApiController
{

Oder einzelne API-Aufrufe:

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

Für Internet Explorer <= v9

IE <= 9 unterstützt CORS nicht. Ich habe ein Javascript geschrieben, das diese Anforderungen automatisch über einen Proxy weiterleitet. Es ist alles zu 100% transparent (Sie müssen nur meinen Proxy und das Skript hinzufügen).

Laden Sie es mit nuget corsproxy herunter und befolgen Sie die enthaltenen Anweisungen.

Blogbeitrag | Quellcode

353
jgauffin

Wenn Sie IIS 7+ verwenden, können Sie eine web.config-Datei im Stammverzeichnis des Ordners mit dem folgenden Eintrag im Abschnitt system.webServer ablegen:

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

Siehe: http://msdn.Microsoft.com/de-de/library/ms178685.aspx .__ und: http://enable-cors.org/#how-iis7

114
LaundroMatt

Ich bin auf ein Problem gestoßen, bei dem der Browser die Bereitstellung von Inhalten verweigerte, die er abgerufen hatte, als die Anforderung in Cookies übergeben wurde (z. B. hatte der xhr seinen withCredentials=true) und die Site hatte Access-Control-Allow-Origin auf * gesetzt. (Der Fehler in Chrome lautete: "Platzhalter kann nicht in Access-Control-Allow-Origin verwendet werden, wenn das Kennzeichen für Berechtigungsnachweise auf" True "gesetzt ist.)

Aufbauend auf der Antwort von @jgauffin, habe ich dies erstellt. Dies ist im Grunde eine Möglichkeit, die Sicherheitsprüfung Ihres Browsers zu umgehen, so die Einschränkung des Problems.

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

Das ist sehr einfach, fügen Sie dies einfach in web.config hinzu

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

Fügen Sie in Origin alle Domänen ein, die Zugriff auf Ihren Webserver haben. In Kopfzeilen von Werden alle möglichen Kopfzeilen eingefügt, die von einer ajax-http-Anforderung verwendet werden können. In Methoden setzen alle Methoden, die Sie auf Ihrem Server zulassen

grüße :) 

14
Zvonimir Tokic

Manchmal verursachen auch OPTIONS-Verb Probleme 

Einfach: Aktualisieren Sie Ihre web.config mit den folgenden Angaben 

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

Und aktualisieren Sie die Webservice/Controller-Header mit httpGet und httpOptions 

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

WebAPI 2 enthält jetzt ein Paket für CORS, das mit folgendem installiert werden kann: Install-Package Microsoft.AspNet.WebApi.Cors -pre -project WebServic 

Sobald dies installiert ist, folgen Sie diesem Code für den Code: http://www.asp.net/web-api/overview/security/enabling-cross-Origin-requests-in-web-api

7
Tarun

Fügen Sie diese Zeile zu Ihrer Methode hinzu, wenn Sie eine API verwenden.

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

Dieses Tutorial ist sehr nützlich. Um eine kurze Zusammenfassung zu geben:

  1. Verwenden Sie das CORS-Paket von Nuget: Install-Package Microsoft.AspNet.WebApi.Cors

  2. Fügen Sie in Ihrer WebApiConfig.cs - Datei config.EnableCors() zur Register() -Methode hinzu.

  3. Fügen Sie ein Attribut zu den Controllern hinzu, die Sie zum Behandeln von cors benötigen:

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

3
    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
Pranav Labhe

Es gibt verschiedene Möglichkeiten, die .__ zu übergeben. Zugriffskontroll-Expose-Header.

  • Wie jgauffin erklärt hat, können wir ein neues Attribut erstellen.
  • Wie LaundroMatt erklärt hat, können wir die Datei web.config hinzufügen.
  • Eine andere Möglichkeit ist, dass wir Code wie unten in der Datei webApiconfig.cs hinzufügen können.

    config.EnableCors (neues EnableCorsAttribute ("", Header: "", Methoden: "*", exposedHeaders: "TestHeaderToExpose") {SupportsCredentials = true}); 

Oder wir können unten in der Global.Asax-Datei Code hinzufügen.

protected void Application_BeginRequest()
        {
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                //These headers are handling the "pre-flight" OPTIONS call sent by the browser
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
                HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "TestHeaderToExpose");
                HttpContext.Current.Response.End();
            }
        }

Ich habe es für die Optionen geschrieben. Bitte ändern Sie das gleiche wie je nach Bedarf.

Viel Spaß beim Codieren !!

1
Developer

In Web.config geben Sie folgendes ein

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

Wenn Sie IIS verwenden, würde ich vorschlagen, das IIS CORS-Modul zu verwenden.
Es ist einfach zu konfigurieren und funktioniert für alle Arten von Controllern.

Hier ist ein Konfigurationsbeispiel: 

    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add Origin="*" />
            <add Origin="https://*.Microsoft.com"
                 allowCredentials="true"
                 maxAge="120"> 
                <allowHeaders allowAllRequestedHeaders="true">
                    <add header="header1" />
                    <add header="header2" />
                </allowHeaders>
                <allowMethods>
                     <add method="DELETE" />
                </allowMethods>
                <exposeHeaders>
                    <add header="header1" />
                    <add header="header2" />
                </exposeHeaders>
            </add>
            <add Origin="http://*" allowed="false" />
        </cors>
    </system.webServer>
0
olsh