首页 文章

webApi 2中的子域CORS

提问于
浏览
9

我正在使用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,可能是正则表达式,并将其添加到允许的原点,这样可以更好 .

我想知道是否有更好,更标准的方式 .

2 回答

  • 4

    使用DynamicPolicyProviderFactory . 这就是我使用的...我甚至在前几天发布了一个question,它显示了如何将允许的域添加到web.config文件中 .

  • 0

    我最后只是写了一个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));
        }
    }
    

相关问题