2

同源策略的缺点之一是它不支持不同的端口或子域。因此,如果您将服务托管在诸如 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 合作了几天。

提前致谢。

4

1 回答 1

0

身份用于向客户端标识服务,因此不会帮助阻止对服务的调用。

如果这是一项免费服务,那么无论客户端来自何处,都不需要对客户端进行身份验证和授权。

另一方面,如果您想保护服务,那么无论呼叫来源如何,您都需要对服务的客户端进行身份验证/授权。关于这个主题有很多资源:

适用于 .NET Framework 4 的 MSDN Windows Communication Foundation (WCF) 和 Windows Workflow Foundation (WF) 示例

SO 保护 WCF 服务

MSDN WCF 安全资源

保护 WCF 服务:使用 ASP.NET 成员资格和角色提供程序

您可以尝试通过在您的方法调用中获取这样的远程端点或在庞大的WCF 可扩展性链中的某处拦截它来暴力获取客户端 IP(这将在大多数情况下工作):

var messageProperty = OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;

之后,您可以进行反向 dns 查找,但这可能并不总是有效(代理、NAT 等)

另一个要点,在 JSON 调用上使用 GET 会导致JSON 劫持

于 2012-05-08T07:56:47.987 回答