ProgramingTip

Asp.Net WebApi2 AspNet.WebApi.Cors 5.2.3에서 작동하지 않는 CORS 활성화

bestdevel 2020. 11. 1. 18:30
반응형

Asp.Net WebApi2 AspNet.WebApi.Cors 5.2.3에서 작동하지 않는 CORS 활성화


http://enable-cors.org/server_aspnet.html 의 단계에 따라 내 RESTful API (ASP.NET WebAPI2로 구현 됨)가 원본 간 요청 (CORS 활성화 됨)에서 작동하도록했습니다. web.config를 수정하지 않습니까?

WebApi Cors 설치를 설치했습니다.

install-package Microsoft.AspNet.WebApi.Cors -ProjectName MyProject.Web.Api

그런 다음 내 App_Start수업 은 다음과 가변 WebApiConfig합니다.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var corsAttr = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(corsAttr);

        var constraintsResolver = new DefaultInlineConstraintResolver();

        constraintsResolver.ConstraintMap.Add("apiVersionConstraint", typeof(ApiVersionConstraint));
        config.MapHttpAttributeRoutes(constraintsResolver); 
        config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttpControllerSelector(config));
        //config.EnableSystemDiagnosticsTracing(); 
        config.Services.Replace(typeof(ITraceWriter), new SimpleTraceWriter(WebContainerManager.Get<ILogManager>())); 
        config.Services.Add(typeof(IExceptionLogger), new SimpleExceptionLogger(WebContainerManager.Get<ILogManager>()));
        config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler()); 
    }
}

하지만 그 후 응용 프로그램을 실행 한 후 Fiddler를 사용하여 http : // localhost : 51589 / api / v1 / persons같은 리소스를 요청 하고 응답에서 다음과 같은 HTTP 헤더를 볼 수 없습니다.

  • Access-Control-Allow-Methods: POST, PUT, DELETE, GET, OPTIONS
  • Access-Control-Allow-Origin: *

단계를 놓치고 있습니까? 컨트롤러에서 다음 주석으로 시도했습니다.

[EnableCors(origins: "http://example.com", headers: "*", methods: "*")]

동일한 결과, CORS가 활성화되지는 않습니다.

그러나 내 web.config에 다음을 추가하면 (AspNet.WebApi.Cors를 설치하지 않습니다) 작동합니다.

<system.webServer>

<httpProtocol>
  <!-- THESE HEADERS ARE IMPORTANT TO WORK WITH CORS -->
  <!--
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="POST, PUT, DELETE, GET, OPTIONS" />
    <add name="Access-Control-Allow-Headers" value="content-Type, accept, origin, X-Requested-With, Authorization, name" />
    <add name="Access-Control-Allow-Credentials" value="true" />
  </customHeaders>
  -->
</httpProtocol>
<handlers>
  <!-- THESE HANDLERS ARE IMPORTANT FOR WEB API TO WORK WITH  GET,HEAD,POST,PUT,DELETE and CORS-->
  <!--

  <remove name="WebDAV" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
-->
</handlers>

어떤 도움도 대단히 감사하겠습니다!

감사합니다.


당신을 위해 축소 된 견본 프로젝트를 만들었습니다.

로컬 Fiddler에서 위의 API 링크시도 하여 헤더를 볼 수 있습니다. 여기에 설명이 있습니다.

Global.ascx

이 모든 작업은 WebApiConfig. 코드 구성에 불고기합니다.

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        WebApiConfig.Register(GlobalConfiguration.Configuration);
    }
}

WebApiConfig.cs

여기에 대한 핵심 방법은 EnableCrossSiteRequests방법입니다. 이것이 당신이해야 할 전부 입니다. EnableCorsAttributeA는 세계적 범위 CORS 속성 입니다.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        EnableCrossSiteRequests(config);
        AddRoutes(config);
    }

    private static void AddRoutes(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "Default",
            routeTemplate: "api/{controller}/"
        );
    }

    private static void EnableCrossSiteRequests(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute(
            origins: "*", 
            headers: "*", 
            methods: "*");
        config.EnableCors(cors);
    }
}

가치 컨트롤러

Get방법은 수신 EnableCors우리는 전역 가해진 속성. Another메서드는 전역 EnableCors.

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { 
            "This is a CORS response.", 
            "It works from any origin." 
        };
    }

    // GET api/values/another
    [HttpGet]
    [EnableCors(origins:"http://www.bigfont.ca", headers:"*", methods: "*")]
    public IEnumerable<string> Another()
    {
        return new string[] { 
            "This is a CORS response. ", 
            "It works only from two origins: ",
            "1. www.bigfont.ca ",
            "2. the same origin." 
        };
    }
}

Web.config

web.config에 특별한 것을 추가 할 필요가 없습니다. 사실, 이것은 데모의 web.config의 모습입니다. 비어 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
</configuration>

도장

var url = "https://cors-webapi.azurewebsites.net/api/values"

$.get(url, function(data) {
  console.log("We expect this to succeed.");
  console.log(data);
});

var url = "https://cors-webapi.azurewebsites.net/api/values/another"

$.get(url, function(data) {
  console.log(data);
}).fail(function(xhr, status, text) {
  console.log("We expect this to fail.");
  console.log(status);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


일부 파일 만 변경됩니다. 이것은 나를 위해 작동합니다.

Global.ascx

public class WebApiApplication : System.Web.HttpApplication {
    protected void Application_Start()
    {
        WebApiConfig.Register(GlobalConfiguration.Configuration);
    } }

WebApiConfig.cs

모든 요청은이 코드를 호출해야합니다.

public static class WebApiConfig {
    public static void Register(HttpConfiguration config)
    {
        EnableCrossSiteRequests(config);
        AddRoutes(config);
    }

    private static void AddRoutes(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "Default",
            routeTemplate: "api/{controller}/"
        );
    }

    private static void EnableCrossSiteRequests(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute(
            origins: "*", 
            headers: "*", 
            methods: "*");
        config.EnableCors(cors);
    } }

일부 컨트롤러

놀라운 사항이 없습니다.

Web.config

web.config에 추가해야합니다.

<configuration> 
  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>   
  </system.webServer> 
</configuration>

CORS 요청의 경우 모든 최신 브라우저는 OPTION 동사로 응답 한 다음 구매 요청이 이어집니다. 이것은 CORS 요청의 경우 사용자에게 확인을 요청하는 데 사용됩니다. 그러나 API의 경우 확인 프로세스를 건너 뛰려면 다음 코드를 Global.asax에 추가하십시오.

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE");

                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                HttpContext.Current.Response.End();
            }
        }

여기서 우리는 OPTIONS 동사를 확인하여 검사를 통과하는 것입니다.


Web.config에 사용자 지정 헤더를 추가했는데 매력처럼 작동했습니다.

구성-system.webServer :

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

동일한 솔루션에 프런트 엔드 앱과 백엔드가 있습니다. 이 작업을 수행하려면 웹 서비스 프로젝트 (백엔드)를 기본값으로 설정해야합니다.

나는 ReST를 사용하고 있었고 다른 것은 시도하지 않았습니다.


내 Web.config CORS의 일부 수정 후 갑자기 내 Web API 2 프로젝트에서 작동이 중지되었습니다 (최소한 프리 플라이트 중 OPTIONS 요청의 경우). Web.config에 아래에 언급 된 섹션이 있어야합니다. 그렇지 않으면 (전역) EnableCorsAttribute가 OPTIONS 요청에서 작동하지 않습니다. 이것은 Visual Studio가 새 Web API 2 프로젝트에 추가 할 것과 똑같은 섹션입니다.

<system.webServer>
  <handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
    <remove name="OPTIONSVerbHandler"/>
    <remove name="TRACEVerbHandler"/>
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
  </handlers>
</system.webServer>

이 답변 중 어느 것도 실제로 작동하지 않습니다. 다른 사람들이 언급했듯이 Cors 패키지는 요청에 Origin 헤더가있는 경우에만 Access-Control-Allow-Origin 헤더를 사용합니다. 그러나 일반적으로 요청에 Origin 헤더를 추가 할 수는 없습니다. 브라우저가이를 규제하려고 할 수도 있기 때문입니다.

웹 API에 대한 교차 사이트 요청을 허용하는 빠르고 더러운 방법을 원한다면 사용자 정의 필터 속성을 작성하는 것이 훨씬 쉽습니다.

public class AllowCors : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext == null)
        {
            throw new ArgumentNullException("actionExecutedContext");
        }
        else
        {
            actionExecutedContext.Response.Headers.Remove("Access-Control-Allow-Origin");
            actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        }
        base.OnActionExecuted(actionExecutedContext);
    }
}

그런 다음 컨트롤러 작업에서 사용하십시오.

[AllowCors]
public IHttpActionResult Get()
{
    return Ok("value");
}

일반적으로 이것의 보안을 보증하지는 않겠지 만, web.config에서 헤더를 설정하는 것보다 훨씬 더 안전 할 것입니다. 이렇게하면 필요한만큼만 특별히 적용 할 수 있기 때문입니다.

물론 특정 출처, 방법 등 만 허용하도록 위를 수정하는 것은 간단합니다.


CORS를 전역 적으로 활성화 하려고 시도하면서 동일한 문제가 발생했습니다 . 그러나 나는 그것을 발견 하지 요청이 포함되어 있지만 경우에만 작업을 Origin헤더 값을. origin헤더 값 을 생략하면 응답에 Access-Control-Allow-Origin.

GET 요청을 테스트하기 위해 DHC 라는 크롬 플러그인을 사용했습니다 . Origin헤더를 쉽게 추가 할 수있었습니다 .


WEBAPI2 : 솔루션. global.asax.cs :

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

솔루션 탐색기에서 api-project를 마우스 오른쪽 버튼으로 클릭합니다. 속성 창에서 '익명 인증'사용 으로 설정하십시오 !!!

이것이 미래의 누군가에게 도움이되기를 바랍니다.


대부분의 브라우저에서 보내는 OPTIONS 요청에 문제가 있었기 때문에이 질문을 찾았습니다. 내 앱은 OPTIONS 요청을 라우팅하고 IoC를 사용하여 많은 객체를 생성했으며 일부는 다양한 이유로이 이상한 요청 유형에 예외를 던졌습니다.

기본적으로 문제를 일으키는 경우 모든 OPTIONS 요청에 대해 무시 경로에 넣으십시오.

var constraints = new { httpMethod = new HttpMethodConstraint(HttpMethod.Options) };
config.Routes.IgnoreRoute("OPTIONS", "{*pathInfo}", constraints);

추가 정보 : OPTIONS 요청을 처리하는 Web API 중지


이것이 미래의 누군가에게 도움이되기를 바랍니다. 내 문제는 전역 CORS를 활성화하기 위해 OP와 동일한 자습서를 따르고 있다는 것입니다. 그러나 AccountController.cs 파일에서 작업 별 CORS 규칙도 설정했습니다.

[EnableCors(origins: "", headers: "*", methods: "*")]

원본에 대한 오류는 null이거나 빈 문자열이 될 수 없습니다. 그러나 모든 장소의 Global.asax.cs 파일에서 오류가 발생했습니다. 해결책은 다음과 같이 변경하는 것입니다.

[EnableCors(origins: "*", headers: "*", methods: "*")]

기원에 *가 있는가? 이것이 Global.asax.cs 파일에서 오류를 일으키는 원인이 누락되었습니다.

이것이 누군가를 돕기를 바랍니다.


Neeraj보다 안전하고 Matthew보다 쉽게 ​​추가 할 수있는 안전한 솔루션은 없습니다. System.Web.HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

컨트롤러의 방법. 그것은 나를 위해 일합니다.

public IHttpActionResult Get()
{
    System.Web.HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    return Ok("value");
}

참고 URL : https://stackoverflow.com/questions/29024313/asp-net-webapi2-enable-cors-not-working-with-aspnet-webapi-cors-5-2-3

반응형