web Api 2中的子域CORS

时间:2014-03-19 16:03:44

标签: asp.net cors asp.net-web-api

我正在使用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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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));
    }
}