webApi 2 中的子域 CORS
我正在使用 WebApi,就像我從http://t.co/mt9wIL8gLA學到的一樣
如果我確切地知道客戶請求的完美來源 URI,這一切都會很好。太糟糕了,我正在編寫一個企業範圍的 API,所以我的請求是 http://apps.contoso.com/myApp/api/foobar
可能來自我域中的應用程序,例如:
http://apps.contoso.com/CRMApp
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)); } }