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>
어떤 도움도 대단히 감사하겠습니다!
감사합니다.
당신을 위해 축소 된 견본 프로젝트를 만들었습니다.
- 출처 : https://github.com/bigfont/webapi-cors
- API 링크 : https://cors-webapi.azurewebsites.net/api/values
로컬 Fiddler에서 위의 API 링크 를 시도 하여 헤더를 볼 수 있습니다. 여기에 설명이 있습니다.
Global.ascx
이 모든 작업은 WebApiConfig
. 코드 구성에 불고기합니다.
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
WebApiConfig.Register(GlobalConfiguration.Configuration);
}
}
WebApiConfig.cs
여기에 대한 핵심 방법은 EnableCrossSiteRequests
방법입니다. 이것이 당신이해야 할 전부 입니다. 는 EnableCorsAttribute
A는 세계적 범위 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");
}
'ProgramingTip' 카테고리의 다른 글
LINQ 쿼리에서 두 개의 "where"절 또는 "&&"를 가지고 있습니까? (0) | 2020.11.02 |
---|---|
SQL Server에서 datetime과 날짜 만 비교하는 방법 (0) | 2020.11.01 |
가져 오기 오기를 기본 인증? (0) | 2020.11.01 |
SQL 만 사용하여 SQL Server 2005 이미지 필드에 그림 삽입 (0) | 2020.11.01 |
http를 통해 파일에 대한 직접 액세스를 차단하지만 PHP 펼쳐 액세스는 허용 (0) | 2020.11.01 |