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
応答ヘッダーは1つだけ存在でき、そのヘッダーにはOrigin値を1つしか含めることができません。したがって、これを機能させるには、次のようなコードが必要です。
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>
サーバー変数の説明RESPONSE_Access_Control_Allow_Origin
部分:
Rewriteでは、RESPONSE_
の後に任意の文字列を使用でき、残りのWordをヘッダー名として使用して応答ヘッダーを作成します(この場合はAccess-Control-Allow-Origin)。書き換えでは、ダッシュ "-"の代わりにアンダースコア "_"が使用されます(書き換えによりダッシュに変換されます)
サーバー変数の説明HTTP_Origin
:
同様に、Rewriteでは、HTTP_
をプレフィックスとして使用して、リクエストヘッダーを取得できます。ダッシュと同じルール(ダッシュ「-」の代わりにアンダースコア「_」を使用)。
Web.APIでは、この属性は http://www.asp.net/web-api/で詳述されているようにMicrosoft.AspNet.WebApi.Cors
を使用して追加できます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
}
すべての答えを読んで試してみたが、誰も助けてくれなかった。他の場所で検索して見つけたのは、カスタム属性を作成して、それをコントローラーに追加できることです。 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 originを定義できる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);
}
}
};