Настройка 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 ответов:
для равнины 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", "*");
в этом уроке очень полезно. Чтобы дать краткое резюме:
используйте пакет CORS, доступный на Nuget:
Install-Package Microsoft.AspNet.WebApi.Cors
в своем добавьте
config.EnableCors()
доRegister()
метод.добавьте атрибут к контроллерам, которые вам нужны для обработки 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); }