WCF:使用 JSONP 将来源列入白名单
Posted
技术标签:
【中文标题】WCF:使用 JSONP 将来源列入白名单【英文标题】:WCF: Whitelist origins using JSONP 【发布时间】:2012-05-15 14:05:43 【问题描述】:同源策略的缺点之一是它不支持不同的端口或子域。因此,如果您将服务托管在诸如 services.site.com 之类的子域上,您将无法在不使用 JSONP 的情况下从 www.site.com 调用该服务。
有没有办法将您的 WCF 服务配置为仅接受来自特定来源的请求?
例子:
$(document).ready(function ()
$("#Button").click(function ()
$.getJSON("http://services.site.com/service.svc/myService?callback=?", function (data)
var jObj = $.parseJSON(data);
$("#Result").html(jObj.MyValue);
);
);
);
如果这是从 www.site.com 调用的,我希望它能够工作。但是,如果像 www.example.com 这样的另一个站点调用它,我希望 WCF 服务阻止它。
我尝试将 web.config 文件配置为:
<identity>
<dns value="www.example.com"/>
</identity>
但是当我尝试从 www.site.com 拨打电话时,它仍然可以正常工作。我相信这是因为我将 crossDomainScriptAccessEnabled 设置为 true 以便 JSONP 返回正确的回调值。到现在才使用 WCF 几天。
提前致谢。
【问题讨论】:
【参考方案1】:身份用于向客户端标识服务,因此不会帮助阻止对服务的调用。
如果这是一项免费服务,那么无论它来自哪里,都不需要对客户端进行身份验证和授权。
另一方面,如果您想保护服务,那么无论呼叫来源如何,您都需要对服务的客户端进行身份验证/授权。关于这个主题有很多资源:
MSDN Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4
SO Securing WCF Services
MSDN WCF Security Resources
Securing WCF Services: Using ASP.NET Membership & Role Providers
您可以尝试通过在您的方法调用中获取这样的远程端点或在广阔的WCF extensibility 中的某处拦截它来暴力获取客户端 IP(这将在大多数时间起作用)链:
var messageProperty = OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
之后,您可以进行反向 dns 查找,但这可能并不总是有效(代理、NAT 等)
另一个快速点,在 JSON 调用上使用 GET 会导致 JSON Hijacking
【讨论】:
以上是关于WCF:使用 JSONP 将来源列入白名单的主要内容,如果未能解决你的问题,请参考以下文章
单元测试可以将“no-unbound-method”列入白名单吗?由于白名单,我将来是不是有可能面临问题
Google 跟踪代码管理器 API 错误“不是客户端的有效来源:http://localhost 尚未被列入客户端 ID 的白名单
Google 登录:不是客户端的有效来源:http://localhost:3000 尚未被列入客户端 ID XXXXXXXXXXXX 的白名单