WCF:使用 JSONP 将来源列入白名单

Posted

技术标签:

【中文标题】WCF:使用 JSONP 将来源列入白名单【英文标题】:WCF: Whitelist origins using 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 几天。

提前致谢。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于WCF:使用 JSONP 将来源列入白名单的主要内容,如果未能解决你的问题,请参考以下文章

单元测试可以将“no-unbound-method”列入白名单吗?由于白名单,我将来是不是有可能面临问题

Firebase CORS,将 IP 范围列入白名单

Google 跟踪代码管理器 API 错误“不是客户端的有效来源:http://localhost 尚未被列入客户端 ID 的白名单

Google 登录:不是客户端的有效来源:http://localhost:3000 尚未被列入客户端 ID XXXXXXXXXXXX 的白名单

是否可以将 Qt WebEngine 中的代理 URL 列入白名单

将 IPv6 列入白名单