2012-07-26 129 views
2

如何保护JavaScript客户端可以使用的WCF服务?任何特定的安全模型?当客户端可以使用Javascript时客户端WCF服务的安全性客户端

我的理解是WCF支持通过使用传输和消息安全的有线数据加密。但是WCF仍然不安全,因为任何人都可以使用该服务(身份验证缺失)。只有数据移动“来回”在通道上加密。这是不够的。因此,我们引入了Mutual Authentication并选择了Certificate作为cridentials。客户需要做的事情是:除了所有的SOAP请求之外,他还应该发送一个有效的证书(客户端代码包含public和PRIVATE KEY,并由WCF管理员发布)由我的服务器信任的CA颁发。

我们使用basicHttpBinding是因为我们的客户端可以是Javascript/Ipad/.Net/DBL客户端。我们可以使用.Net/SOAPUI/JAVA客户端来使用这些服务。所以我们对这种方法很满意。

但今天在分析中,我们发现JavaScript客户端无法使用我们的服务,因为它不支持相互身份验证(如果我错了,请纠正我)。即使它支持相互身份验证并向服务器发布有效证书,我们也不能让所有客户端(Web浏览器)提供客户端证书,因为它还包含公共密钥和私有密钥(请注意私有密钥!)以及这是我的服务器盲目信任的。

现在我有点困惑。有人可以建议一些JavaScript支持的安全模型,而不会有任何安全隐患。像RESTful WCF一样。

据我所知,JavaScript不支持Message Security,它只支持传输安全。我不在乎数据如何通过电线加密。我关心的是客户端如何通过我的WCF服务进行身份验证。

非常感谢

+0

你可以尝试使用HMAC算法进行身份验证,许多服务提供商如amazon等使用该算法... – Rajesh 2012-07-26 09:52:49

回答

2

如果您已经使用窗体身份验证为您的网站,那么你可以利用ASP.NET pipline通过使AspNetCompatibilityRequirementsMode到须检查FormAuthentication的Cookie。更多细节可以在这里找到SO thread

如果你的服务是独立的服务,它只是被不同的客户端使用,而你没有任何控制,那么你可以使用oauth认证,其中将有一个消费者的秘密密钥将被共享给所有经过身份验证的客户端。调用者将使用该密钥签署一些信息,服务器也将使用相同的密钥对其进行签名,然后进行比较。有关实现的详细信息,请看这excellent article

+0

我没有网站进行表单身份验证......它像JavaScript客户端(HTML页面)将调用REST WCF :-)链接解释如何在.NET中使用客户端和服务器时使用OAuth ..我搜索兴起一个例子,其中服务器是WCF和客户端将JavaScript ...但没有得到一个......请分享,如果你有任何与JS客户端的例子...非常感谢:-) – user1312242 2012-07-28 20:05:15

0

哦,我看到了...我正在做R &关于由OA建议的组件...... OAuth ...我到目前为止所能做的是:暴露webHttpBinding终结点SSL和我的JavaScript客户端可以使用JSONP使用$ Ajax调用SSL安全服务...这意味着该通道被加密..现在我需要的是在WCF中应用OAuth ...您能指导我如何使用Javascript客户端会理解OAuth?我的意思是我有从这里下载的OAuth服务器代码(http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs),但如何使用JavaScript调用此类服务​​?我在这一点上懒惰地做R & D,如果我得到任何答案,我会发布。

这里是我的REST WCF通过SSL配置希望它能帮助别人:

<?xml version="1.0"?> 

<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 

    <system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
     <binding name="jsonpSsl" crossDomainScriptAccessEnabled="true"> 
      <security mode="Transport" /> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="JsonServiceBehaviors"> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceMetadata httpsGetEnabled="true"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="webHttpBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <services> 
     <service name="WCFTransportSecurity.TransportSecurityService" behaviorConfiguration="JsonServiceBehaviors"> 
     <endpoint address="" binding="webHttpBinding" bindingConfiguration="jsonpSsl" contract="WCFTransportSecurity.ITransportSecurityService" behaviorConfiguration="webHttpBehavior"/> 
     </service> 
    </services> 
    </system.serviceModel> 

    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

这里是JQuery的AJAX调用服务(希望它可以帮助别人)

$.ajax(
      { 
       type: "GET", 
       data: "{}", 
       contentType: "application/json; charset=utf-8", 
       dataType: "jsonp", 
       url: "https://localhost/WCFTransportSecurity/TransportSecurityService.svc/getdata/" + $("#TextBox1").val(), 
       success: function (a) { $("#lblResponse").text(a); }, 
       error: function (a) {$("#lblResponse").html("Error while Processing: Error Code: " + a.status + "<br/>and Error Message: <span style='color:red'>" + a.statusText + "</span>"); } 
      });