2012-07-26 127 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>"); } 
      });