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

提前致谢。

最佳答案

身份用于向客户端标识服务,从而无助于阻止对该服务的调用。

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

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

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

关于jquery - WCF:使用JSONP将白名单来源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10475752/

10-17 01:17