Asp.net

webApi 2 中的子域 CORS

  • October 20, 2016

我正在使用 WebApi,就像我從http://t.co/mt9wIL8gLA學到的一樣

如果我確切地知道客戶請求的完美來源 URI,這一切都會很好。太糟糕了,我正在編寫一個企業範圍的 API,所以我的請求是 http://apps.contoso.com/myApp/api/foobar

可能來自我域中的應用程序,例如:

http://apps.contoso.com/CRMApp

http://apps.contoso.com/XYZ

http://www.contoso.com/LegacyApp

http://test.contoso.com/newApps/WowApp …以及我的企業建構的所有新應用程序。

解決這個問題的最佳方法是什麼?使用Origins="*"很俗氣,將來源添加到我的 WS 源並重新部署很俗氣。

我目前的解決方案是編寫一個自定義 CorsPolicyAttribute,如http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api#cors-policy-providers

並從 web.config 中的 appsettings 讀取允許的來源。更好的一點是,在自定義屬性中,檢查請求 Origin: 標頭是否來自 contoso.com,可能帶有正則表達式,並將其添加到允許的來源。

我想知道是否有更好,更標準的方式。

使用DynamicPolicyProviderFactory。這就是我使用的…前幾天我什至發布了一個關於它的問題,顯示瞭如何將允許的域添加到 web.config 文件中。

我最終只寫了一個 AuthorizationFilterAttribute,儘管我可能剛剛完成了一個正常的 FilterAttribute。

public class FilterReferals : AuthorizationFilterAttribute
{
   public override void OnAuthorization(HttpActionContext actionContext)
   {
       var request = actionContext.Request;

       if (!AllowedReferers.GetAllowedReferersList().Contains(request.Headers.Referrer?.Host.ToLower()))
       {
           Challenge(actionContext);
           return;
       }

       base.OnAuthorization(actionContext);
   }

   void Challenge(HttpActionContext actionContext)
   {
       var host = actionContext.Request.RequestUri.DnsSafeHost;
       actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
       actionContext.Response.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", host));
   }
}

引用自:https://stackoverflow.com/questions/22511627