【问题标题】:WCF: Whitelist origins using JSONPWCF:使用 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 几天。

提前致谢。

【问题讨论】:

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


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2022-08-11
      • 2015-01-04
      • 2021-12-08
      • 2015-03-29
      • 2017-10-05
      • 2012-10-06
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多