/ / Festlegen von Access-Control-Allow-Origin in ASP.Net MVC - einfachste Methode - JSON, asp.net-mvc-3, asp.net-ajax

Festlegen von Access-Control-Allow-Origin in ASP.Net MVC - einfachste Methode - JSON, asp.net-mvc-3, asp.net-ajax

Ich habe ein einfaches Action-Verfahren, das einige JSON zurückgibt. Es läuft auf ajax.example.com. Ich muss darauf von einer anderen Website someothersite.com zugreifen.

Wenn ich versuche es anzurufen, bekomme ich das erwartete ...:

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

Ich kenne zwei Möglichkeiten, um das zu umgehen: JSONP und Erstellen eines benutzerdefinierte HttpHandler zu setze die Überschrift.

Gibt es keinen einfacheren Weg?

Ist es für eine einfache Aktion nicht möglich, entweder eine Liste erlaubter Herkunft zu definieren oder einfach allen zu erlauben? Vielleicht ein Aktionsfilter?

Optimal wäre ...:

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);

Antworten:

337 für die Antwort № 1

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 Anfragen automatisch über einen Proxy leitet. Es ist alles 100% transparent (Sie müssen nur meinen Proxy und das Skript hinzufügen).

Laden Sie es mit nugget herunter corsproxy und folgen Sie den enthaltenen Anweisungen.

Blogeintrag | Quellcode


107 für die Antwort № 2

Wenn Sie IIS 7+ verwenden, können Sie im Abschnitt system.webServer eine Datei web.config in das Stammverzeichnis des Ordners einfügen:

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

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


18 für die Antwort № 3

Ich stieß auf ein Problem, bei dem der Browser es ablehnte, Inhalte zu liefern, die er abgerufen hatte, als die Anfrage in Cookies weitergegeben wurde (z. B. die xhr hatte ihre withCredentials=true), und die Website hatte Access-Control-Allow-Origin einstellen *. (Der Fehler in Chrome lautete: "Der Platzhalter in Access-Control-Allow-Origin kann nicht verwendet werden, wenn das Credentials-Flag wahr ist.")

Aufbauend auf der Antwort von @jgauffin, habe ich dies erstellt, was im Grunde eine Art ist, um diese spezielle Browser-Sicherheitsprüfung zu umgehen, also least 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);
}
}

12 für die Antwort № 4

Das ist wirklich einfach, füge das 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>

Setzen Sie in Origin alle Domains, die Zugriff auf Ihren Webserver haben, in Kopfzeilen setzen Sie alle möglichen Header, die jede Ajax HTTP-Anfrage verwenden kann, Fügen Sie in Methoden alle Methoden hinzu, die Sie auf Ihrem Server zulassen

Grüße :)


8 für die Antwort № 5

Manchmal verursacht auch das OPTIONS-Verb Probleme

Einfach: Aktualisieren Sie Ihre web.config wie folgt

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

7 für die Antwort № 6

WebAPI 2 verfügt jetzt über ein Paket für CORS, das installiert werden kann mit: Install-Paket Microsoft.AspNet.WebApi.Cors -pre -project WebServic

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


3 für die Antwort № 7

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

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

3 für die Antwort № 8

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

  1. Verwenden Sie das CORS-Paket, das auf Nuget verfügbar ist: Install-Package Microsoft.AspNet.WebApi.Cors

  2. In deinem WebApiConfig.cs Datei, hinzufügen config.EnableCors() zum Register() Methode.

  3. Fügen Sie den Controllern, die Sie für die Verarbeitung von cors benötigen, ein Attribut hinzu:

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


1 für die Antwort № 9
    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);
}

0 für die Antwort № 10

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>