我正在关注 WebAPI 2 中的 CORS 文档。
如果我知道客户请求的确切来源 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
,如有关自定义 CORS 策略提供程序部分中所述,并从 appsettings
中的 web.config
读取允许的来源。更好的一点是,在自定义属性内,检查请求 Origin: 标头是否来自 contoso.com,可能使用正则表达式,然后将其添加到允许的来源。
我想知道是否有更好、更标准的方法。
。这就是我使用的...前几天我什至发布了一个关于它的问题,展示了如何将允许的域添加到 web.config 文件中。
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));
}
}