WCF:白名单起源使用JSONP

时间:2012-05-07 01:38:17

标签: jquery asp.net wcf jsonp same-origin-policy

同一原产地政策的一个缺点是它不支持不同的端口或子域。因此,如果您在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 个答案:

答案 0 :(得分:0)

标识用于向客户端标识服务,因此无助于阻止对服务进行调用。

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

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

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

您可以尝试通过在方法调用中获取此类远程端点或在广泛的{{3}中的某个位置拦截它来强制获取客户端IP(这将在大多数中工作)。链:

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

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

另一个快速点,在JSON调用上使用GET可以导致WCF extensibility