도메인이 여러 개인 Access-Control-allow-origin입니다.
내 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" />
하지만 모두 효과가 없어요올바른 구문은 무엇입니까?
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>
서버 변수 부분을 설명합니다.
Rewrite에서 다음 문자열은 모두 사용할 수 있습니다.RESPONSE_나머지 단어를 헤더 이름으로 사용하여 응답 헤더를 작성합니다(이 경우 액세스 제어-허용-발신).다시 쓰기는 대시 "-" 대신 밑줄 "_"를 사용합니다(다시 쓰기는 대시로 변환).
서버 변수를 설명합니다.
마찬가지로 Rewrite에서는 다음을 사용하여 요청 헤더를 가져올 수 있습니다.HTTP_접두사로 사용합니다.대시를 사용하는 규칙은 동일합니다(대시 "-" 대신 밑줄 "_" 사용).
하나만 있을 수 있습니다.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");
}
Web.API에서 이 속성은 다음을 사용하여 추가할 수 있습니다.Microsoft.AspNet.WebApi.Cors자세한 내용은 http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api를 참조하십시오.
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
}
IIS 7.5 이상의 경우 IIS CORS 모듈을 사용할 수 있습니다. https://www.iis.net/downloads/microsoft/iis-cors-module
web.config는 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add origin="http://localhost:1506">
<allowMethods>
<add method="GET" />
<add method="HEAD" />
<add method="POST" />
<add method="PUT" />
<add method="DELETE" />
</allowMethods>
</add>
<add origin="http://localhost:1502">
<allowMethods>
<add method="GET" />
<add method="HEAD" />
<add method="POST" />
<add method="PUT" />
<add method="DELETE" />
</allowMethods>
</add>
</cors>
</system.webServer>
</configuration>
구성 참조는 https://learn.microsoft.com/en-us/iis/extensions/cors-module/cors-module-configuration-reference에서 찾을 수 있습니다.
모든 답을 읽고 시도해 본 결과, 아무도 저를 도와주지 않았어요.다른 곳에서 검색하다가 발견한 것은 컨트롤러에 추가할 수 있는 사용자 지정 특성을 만들 수 있다는 것입니다.EnableCors 도메인을 덮어쓰고 화이트리스트 도메인을 추가합니다.
이 솔루션은 컨트롤러의 EnableCors 속성에 화이트리스트 도메인을 하코딩하는 대신 웹 구성(앱 설정)에 화이트리스트 도메인을 가질 수 있으므로 잘 작동합니다.
[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을 동적으로 방출할 수 있습니다.
마이크로소프트에서 다운로드할 수 있는 CORS IIS 추가 기능을 사용할 수 있었습니다.여러 도메인을 지원하고, 서로 다른 인증 구성을 허용하며, 원하는 경우 API의 하위 집합만 서로 다른 도메인에 제공할 수 있습니다.
web.config에 이와 같은 섹션만 추가하면 됩니다.
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add origin="http://server1.com"
allowCredentials="true"
allowed="true"
maxAge="120">
</add>
<add origin="http://server2.com"
allowed="true"
allowCredentials="true"
maxAge="120">
</add>
</cors>
</system.webServer>
옵션에 대해 자세히 알아보려면 여기를 참조하십시오.
처음에 저를 놀라게 했던 한 가지 은 이것이 다른 web.config와 충돌한다는 것입니다. 예를 들어 수동으로 web.config를 추가하는 것과 같습니다.Access-Control-Origin이렇게요.
또 다른 주의 사항은 서버 설정이 완벽하더라도 실제로 서버를 사용하려면 클라이언트 측 조정이 필요할 수 있다는 것입니다.예를 들어, 다음은 인증으로 CORS 서버에 대해 메서드를 호출하는 데 사용해야 했던 Javascript 가져오기 메서드 옵션입니다.
fetch(url, {
method: 'GET', // *GET, POST, PUT, DELETE, etc.
mode: 'cors', // no-cors, *cors, same-origin
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
credentials: 'include', // include, *same-origin, omit
})
행운을 빌어요.
이 코드를 ASP에 추가할 수 있습니다.Global.asax 파일의 Net WebAPI 프로젝트입니다.
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");
}
}
사용자 자신의 미들웨어를 사용하여 여러 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.example.com");
policy.Origins.Add("http://bar.example.com");
return Task.FromResult(policy);
}
}
};
다음 항목만 있으면 됩니다.
- Global.asax를 프로젝트에 추가합니다.
- 제제세요 delete를 삭제합니다.
<add name="Access-Control-Allow-Origin" value="*" />web.config를 참조하십시오. 나중에 이것을 더하면 됩니다.
Application_BeginRequestGlobal.asax의 메서드: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(); }
이게 도움이 됐으면 좋겠네요
다음을 시도해 보십시오.
<add name="Access-Control-Allow-Origin" value="['URL1','URL2',...]" />
언급URL : https://stackoverflow.com/questions/17323350/access-control-allow-origin-with-multiple-domains 입니다.
'programing' 카테고리의 다른 글
| 굵은 글씨와 굵은 글씨가 아닌 텍스트를 단일 UILabel로 표시합니까? (0) | 2023.04.25 |
|---|---|
| Eclipse: 파일 이름을 빠르게 검색합니다. (0) | 2023.04.25 |
| 배치를 사용하여 xlsx 파일을 csv로 변환합니다. (0) | 2023.04.25 |
| angular2 제출 버튼을 누르지 않고 enter를 눌러 양식을 제출합니다. (0) | 2023.04.25 |
| 한 디렉터리에서 기존 디렉터리로 파일을 복사합니다. (0) | 2023.04.25 |