[json] ASP.Net MVC에서 Access-Control-Allow-Origin 설정-가장 간단한 방법

나는 간단한 동작 방법을 가지고 있는데, 그것은 json을 반환합니다. ajax.example.com에서 실행됩니다. 다른 사이트 someothersite.com에서이 사이트에 액세스해야합니다.

전화하려고하면 예상대로 얻을 수 있습니다 … :

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

이 문제를 해결하는 두 가지 방법 인 JSONP 와 헤더를 설정하기 위해 사용자 정의 HttpHandler 를 작성하는 방법을 알고 있습니다.

더 간단한 방법이 없습니까?

간단한 조치로 허용 된 원점 목록을 정의하거나 모든 사람을 허용 할 수 없습니까? 액션 필터일까요?

최적은 … :

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);



답변

일반 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 웹 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 <= v9의 경우

IE <= 9는 CORS를 지원하지 않습니다. 프록시를 통해 해당 요청을 자동으로 라우팅하는 자바 스크립트를 작성했습니다. 모두 100 % 투명합니다 (내 프록시와 스크립트 만 포함하면됩니다).

너겟을 사용하여 다운로드 corsproxy하고 포함 된 지침을 따르십시오.

블로그 게시물 | 소스 코드


답변

IIS 7 이상을 사용하는 경우 system.webServer 섹션에서 web.config 파일을 폴더의 루트에 넣을 수 있습니다.

<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


답변

요청이 쿠키를 통과했을 때 검색 한 콘텐츠 (예 : xhr에 있음 withCredentials=true)를 브라우저가 거부 하고 사이트가로 Access-Control-Allow-Origin설정되는 문제가 발생했습니다 *. Chrome의 오류는 “자격 증명 플래그가 true 인 경우 Access-Control-Allow-Origin에서 와일드 카드를 사용할 수 없습니다.”입니다.

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


답변

이것은 정말 간단합니다. web.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>

Origin에서는 웹 서버에 액세스 할 수있는 모든 도메인을 헤더에 넣고 헤더에는 ajax http 요청에서 사용할 수있는 가능한 모든 헤더를 넣고 메소드에 서버에서 허용하는 모든 메소드를 넣습니다.

안부 🙂


답변

때로는 옵션 동사도 문제를 일으킨다

간단히 : 다음으로 web.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>

httpGet 및 httpOptions로 웹 서비스 / 컨트롤러 헤더를 업데이트하십시오.

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


답변

WebAPI 2에는 다음을 사용하여 설치할 수있는 CORS 용 패키지가 있습니다.
Install-Package Microsoft.AspNet.WebApi.Cors -pre -project 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", "*");