同一原产地政策的一个缺点是它不支持不同的端口或子域。因此,如果您在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合作了几天。
提前致谢。
答案 0 :(得分:0)
标识用于向客户端标识服务,因此无助于阻止对服务进行调用。
如果这是一项免费服务,则无论身份来自何处,都无需对客户进行身份验证和授权。
另一方面,如果您想保护服务,则无论呼叫来源如何,您都需要对服务进行身份验证/授权客户端。有关此主题的资源很多:
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