116

access-control-allow-origin私の web.config で、ディレクティブに複数のドメインを指定したいと考えています。使いたくない*。私はこの構文を試しました:

<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" />

しかし、どれも機能しません。正しい構文は何ですか?

4

12 に答える 12

107

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_に任意の文字列を使用でき、残りの単語をヘッダー名 (この場合は Access-Control-Allow-Origin) として使用して応答ヘッダーを作成します。Rewrite はダッシュ "-" の代わりにアンダースコア "_" を使用します (rewrite はそれらをダッシュ​​に変換します)

サーバー変数の説明HTTP_ORIGIN:同様に、Rewriteでは、プレフィックスとして
使用して任意のリクエスト ヘッダーを取得できます。HTTP_ダッシュと同じルール (ダッシュ「-」の代わりにアンダースコア「_」を使用)。

于 2015-06-27T02:04:52.167 に答える
22

Web.API では、 http:Microsoft.AspNet.WebApi.Cors //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
}
于 2015-01-16T13:14:28.200 に答える
5

すべての回答を読んで試してみましたが、どれも役に立ちませんでした。他の場所を検索しているときに見つけたのは、コントローラーに追加できるカスタム属性を作成できることです。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);
        }
    }
}

このガイドをオンラインで見つけたところ、魅力的に機能しました。

http://jnye.co/Posts/2032/dynamic-cors-origins-from-appsettings-using-web-api-2-2-cross-origin-support

困っている人のためにここに置いておこうと思いました。

于 2016-11-04T19:53:56.397 に答える
3

「monsur」からのアドバイスに従って、リクエスト処理コードでこれを解決することができました。

string origin = WebOperationContext.Current.IncomingRequest.Headers.Get("Origin");

WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", origin);
于 2013-08-17T16:00:50.867 に答える
2

Thinktecture IdentityModel ライブラリを調べてください。CORS が完全にサポートされています。

http://brockallen.com/2012/06/28/cors-support-in-webapi-mvc-and-iis-with-thinktecture-identitymodel/

また、必要な ACA-Origin を動的に発行できます。

于 2013-06-27T03:44:48.517 に答える
-3

あなただけが必要です:

  • プロジェクトに 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();
    }
    

これが助けになることを願っています。それは私のために働きます。

于 2013-07-23T23:35:33.353 に答える