여러 도메인을 폴더 액세스 제어 허용 출처
내 web.config에서 access-control-allow-origin
지시문에 대해 둘 이상의 도메인을 지정하고 싶습니다 . 사용하고 싶지 않습니다 *
. 이 구문을 시도했습니다.
<add name="Access-Control-Allow-Origin" value="http://localhost:1506, http://localhost:1502" />
이 하나
<add name="Access-Control-Allow-Origin" value="http://localhost:1506 http://localhost:1502" />
이 하나
<add name="Access-Control-Allow-Origin" value="http://localhost:1506; http://localhost:1502" />
그리고 이것
<add name="Access-Control-Allow-Origin" value="http://localhost:1506" />
<add name="Access-Control-Allow-Origin" value="http://localhost:1502" />
그러나 그들 중 누구도 작동하지 않습니다. 올바른 구문은 무엇입니까?
이 단지 하나가 될 수있는 Access-Control-Allow-Origin
응답 헤더, 그 헤더는 하나의 값을 사용할 수 있습니다. 따라서이 작업을 수행해야 다음과 같은 코드가 필요합니다.
Origin
헤더를 가져 요청 고객 옵니다 .- 원본 값이 화이트리스트 값 중 하나인지 확인합니다.
- 유효하면
Access-Control-Allow-Origin
해당 값으로 헤더를 설정합니다 .
web.config를 통해서만 작업을 수행 할 수있는 방법은 생각합니다.
if (ValidateRequest()) {
Response.Headers.Remove("Access-Control-Allow-Origin");
Response.AddHeader("Access-Control-Allow-Origin", Request.UrlReferrer.GetLeftPart(UriPartial.Authority));
Response.Headers.Remove("Access-Control-Allow-Credentials");
Response.AddHeader("Access-Control-Allow-Credentials", "true");
Response.Headers.Remove("Access-Control-Allow-Methods");
Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
}
IIS 7.5+ 및 Rewrite 2.0의 경우 다음에서 사용할 수 있습니다.
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
<add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,PUT,DELETE" />
</customHeaders>
</httpProtocol>
<rewrite>
<outboundRules>
<clear />
<rule name="AddCrossDomainHeader">
<match serverVariable="RESPONSE_Access_Control_Allow_Origin" pattern=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{HTTP_ORIGIN}" pattern="(http(s)?://((.+\.)?domain1\.com|(.+\.)?domain2\.com|(.+\.)?domain3\.com))" />
</conditions>
<action type="Rewrite" value="{C:0}" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
서버 변수 부분 설명 : 다시 작성하는 곳에서 임의의 URL을 사용할 수 있고 나머지 단어를 헤더 이름으로 사용하여 응답 헤더를 생성합니다 (이 경우 Access-Control-Allow-Origin). 다시 쓰기는 대시 "-"대신 밑줄 "_"을 사용합니다 (다시 쓰기는 대시로 변환 함).RESPONSE_Access_Control_Allow_Origin
RESPONSE_
서버 변수 설명 : Rewrite 에서는 요청을 접두사 로 사용하여 요청 합니다. 대시와 동일한 규칙 (대시 "-"대신 밑줄 "_"사용)HTTP_ORIGIN
HTTP_
Web.API 에서이 속성은 http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api에Microsoft.AspNet.WebApi.Cors
자세히 설명하고 추가 할 수 있습니다 .
MVC 에서 필터 속성을 만들어 작업을 수행 할 수 있습니다.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
AllowMultiple = true, Inherited = true)]
public class EnableCorsAttribute : FilterAttribute, IActionFilter {
private const string IncomingOriginHeader = "Origin";
private const string OutgoingOriginHeader = "Access-Control-Allow-Origin";
private const string OutgoingMethodsHeader = "Access-Control-Allow-Methods";
private const string OutgoingAgeHeader = "Access-Control-Max-Age";
public void OnActionExecuted(ActionExecutedContext filterContext) {
// Do nothing
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var isLocal = filterContext.HttpContext.Request.IsLocal;
var originHeader =
filterContext.HttpContext.Request.Headers.Get(IncomingOriginHeader);
var response = filterContext.HttpContext.Response;
if (!String.IsNullOrWhiteSpace(originHeader) &&
(isLocal || IsAllowedOrigin(originHeader))) {
response.AddHeader(OutgoingOriginHeader, originHeader);
response.AddHeader(OutgoingMethodsHeader, "GET,POST,OPTIONS");
response.AddHeader(OutgoingAgeHeader, "3600");
}
}
protected bool IsAllowedOrigin(string origin) {
// ** replace with your own logic to check the origin header
return true;
}
}
그런 다음 특정 작업 / 컨트롤러에 대해 활성화합니다.
[EnableCors]
public class SecurityController : Controller {
// *snip*
[EnableCors]
public ActionResult SignIn(Guid key, string email, string password) {
또는 Global.asax.cs의 모든 컨트롤러에 추가하십시오.
protected void Application_Start() {
// *Snip* any existing code
// Register global filter
GlobalFilters.Filters.Add(new EnableCorsAttribute());
RegisterGlobalFilters(GlobalFilters.Filters);
// *snip* existing code
}
모든 답변을 읽고 시도한 후에도 아무도 도와주지 않습니다. 다른 곳에서 검색하는 동안 발견 한 컨트롤러에 추가 할 수있는 사용자 지정 속성을 만들 수있을 것입니다. EnableCors를 사용하고 그 안에 화이트리스트 도메인을 추가합니다.
이 솔루션은 컨트롤러의 EnableCors 속성에서 도메인을 하 코딩하는 대신 webconfig (appsettings)에서 허용 목록에있는 도메인을 사용할 수 있기 때문에 작동합니다.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class EnableCorsByAppSettingAttribute : Attribute, ICorsPolicyProvider
{
const string defaultKey = "whiteListDomainCors";
private readonly string rawOrigins;
private CorsPolicy corsPolicy;
/// <summary>
/// By default uses "cors:AllowedOrigins" AppSetting key
/// </summary>
public EnableCorsByAppSettingAttribute()
: this(defaultKey) // Use default AppSetting key
{
}
/// <summary>
/// Enables Cross Origin
/// </summary>
/// <param name="appSettingKey">AppSetting key that defines valid origins</param>
public EnableCorsByAppSettingAttribute(string appSettingKey)
{
// Collect comma separated origins
this.rawOrigins = AppSettings.whiteListDomainCors;
this.BuildCorsPolicy();
}
/// <summary>
/// Build Cors policy
/// </summary>
private void BuildCorsPolicy()
{
bool allowAnyHeader = String.IsNullOrEmpty(this.Headers) || this.Headers == "*";
bool allowAnyMethod = String.IsNullOrEmpty(this.Methods) || this.Methods == "*";
this.corsPolicy = new CorsPolicy
{
AllowAnyHeader = allowAnyHeader,
AllowAnyMethod = allowAnyMethod,
};
// Add origins from app setting value
this.corsPolicy.Origins.AddCommaSeperatedValues(this.rawOrigins);
this.corsPolicy.Headers.AddCommaSeperatedValues(this.Headers);
this.corsPolicy.Methods.AddCommaSeperatedValues(this.Methods);
}
public string Headers { get; set; }
public string Methods { get; set; }
public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
return Task.FromResult(this.corsPolicy);
}
}
internal static class CollectionExtensions
{
public static void AddCommaSeperatedValues(this ICollection<string> current, string raw)
{
if (current == null)
{
return;
}
var paths = new List<string>(AppSettings.whiteListDomainCors.Split(new char[] { ',' }));
foreach (var value in paths)
{
current.Add(value);
}
}
}
이 가이드를 온라인에서 찾았고 매력처럼 작동했습니다.
도움이 필요한 사람을 여기에 떨어 뜨릴 생각했습니다.
나는 'monsur'의 조언에 따라 요청 처리 코드에서이 문제를 해결했습니다.
string origin = WebOperationContext.Current.IncomingRequest.Headers.Get("Origin");
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", origin);
Thinktecture IdentityModel 라이브러리를 살펴보십시오-완전한 CORS 지원이 있습니다.
http://brockallen.com/2012/06/28/cors-support-in-webapi-mvc-and-iis-with-thinktecture-identitymodel/
또한 원하는 ACA-Origin을 동적으로 방출 할 수 있습니다.
owin 미들웨어를 사용하여 여러 cors 출처를 정의 할 수있는 cors 정책을 정의 할 수 있습니다.
return new CorsOptions
{
PolicyProvider = new CorsPolicyProvider
{
PolicyResolver = context =>
{
var policy = new CorsPolicy()
{
AllowAnyOrigin = false,
AllowAnyMethod = true,
AllowAnyHeader = true,
SupportsCredentials = true
};
policy.Origins.Add("http://foo.com");
policy.Origins.Add("http://bar.com");
return Task.FromResult(policy);
}
}
};
이 코드를 asp.net webapi 프로젝트에 추가 할 수 있습니다.
Global.asax 파일
protected void Application_BeginRequest()
{
string origin = Request.Headers.Get("Origin");
if (Request.HttpMethod == "OPTIONS")
{
Response.AddHeader("Access-Control-Allow-Origin", origin);
Response.AddHeader("Access-Control-Allow-Headers", "*");
Response.AddHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE");
Response.StatusCode = 200;
Response.End();
}
else
{
Response.AddHeader("Access-Control-Allow-Origin", origin);
Response.AddHeader("Access-Control-Allow-Headers", "*");
Response.AddHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE");
}
}
다음 만 필요합니다.
- 프로젝트에 Global.asax를 추가하고
<add name="Access-Control-Allow-Origin" value="*" />
web.config에서 삭제 하십시오.나중에
Application_BeginRequest
Global.asax 메서드에 다음을 추가합니다 .HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin","*"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,PUT,DELETE"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept"); HttpContext.Current.Response.End(); }
도움이 되었기를 바랍니다. 그것은 나를 위해 일합니다.
참고 URL : https://stackoverflow.com/questions/17323350/access-control-allow-origin-with-multiple-domains
'IT' 카테고리의 다른 글
"내 다른 차는 cdr"이란 무엇을 의미합니까? (0) | 2020.09.09 |
---|---|
SVG에서 변환 원점을 설정하는 방법 (0) | 2020.09.09 |
Logstash가 파일을 재분석하도록 강제하는 방법은 무엇입니까? (0) | 2020.09.09 |
생성자가 @JsonCreator로 주석을 달았을 때 그 인수에 @JsonProperty로 주석을 달아야하는 이유는 무엇입니까? (0) | 2020.09.09 |
내 탐색 모음에서 목록 항목의 전체 영역을 링크로 클릭 할 수 있습니까? (0) | 2020.09.09 |