2010-08-18 108 views
4

我有一個WCF服務需要從客戶端調用(ajax調用)。 我想在ASPX頁面上使用ScriptManager將ServiceReference添加到WCF服務(或)JQuery ajax調用到WCF服務。我想拒絕匿名用戶訪問WCF服務。在從JavaScript調用服務方法之前,有沒有辦法進行用戶身份驗證?如何從客戶端保護我的WCF服務調用?如何使用AJAX調用WCF服務時對用戶進行身份驗證?

+0

您是否試圖從您的JavaScript內認證用戶?所以如果用戶沒有被認證,那麼服務調用甚至不會被創建?對不起,如果我重複你的問題,但我想確保我理解你的要求。謝謝! – 2010-08-19 02:57:07

+0

wcf ajax服務沒有像Windows身份驗證,用戶名/密碼身份驗證,x509證書等任何安全功能。我們必須使用SSL保護傳輸級別的數據,但我想以安全的方式保護我的wcf ajax調用,我的意思是我不要讓黑客或欺騙或使用JavaScript來創建我的Web方法。我不知道該怎麼做。 – lourdhu 2010-08-22 02:37:41

+0

在下面添加了一個答案/建議。不知道這是你在找什麼,但讓我知道,我可以相應地更新。 – 2010-08-23 02:05:07

回答

5

有很多事情可以做,以確保您的WCF服務。如果您的服務已經是現有整體ASP.NET應用程序的一部分,可能最簡單的方法就是爲您的服務啓用ASP.NET兼容模式。如果您的ASP.NET應用程序使用身份驗證來驗證用戶(例如表單身份驗證),並且您正在通過會話cookie啓用該功能,那麼ASP.NET兼容模式將爲您完成大部分工作。

默認情況下,這個被禁用,但是你可以用除了你的web.config啓用:

<system.serviceModel> 
     ... 
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
     ... 
</system.serviceModel> 

這將使在應用程序中所有的服務兼容模式。您也可以通過服務的基礎服務通過設置web.config中值,也使用您的服務類而不是接口)的AspNetCompatibilityRequirements屬性啓用此:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
public class FooService: IFooService { 
} 

當您啓用此設置,您可以訪問HttpContext.Current(就像一個ASP.NET頁面),它也會強制用戶必須在訪問.svc文件之前進行身份驗證(就像在訪問任何.aspx文件之前必須進行身份驗證一樣)。如果您嘗試訪問.svc文件而未通過身份驗證,並且您使用表單身份驗證,則調用者將被重定向到默認登錄頁面,並且在成功身份驗證後,將被重定向到.svc文件。

這一建議作出一些假設:

  • 你的服務是在ASP.NET應用程序;
  • 您正在使用某種類型的ASP.NET身份驗證(如表單身份驗證)來驗證用戶的憑據並在cookie中保存驗證票據;

這個建議,儘管可能不是最安全或最健壯的,但可能是最簡單的方法,至少可以起牀和運行,並保證您的網站在合理的程度上。

以下是關於ASP.NET兼容模式的一個很好的MSDN library intro article

如果這樣可行,下一步可能是研究HMAC身份驗證(包括更多的工作和密鑰的協調 - 但它絕對是更安全的IMHO)。這是一個很好的實施它的步驟 - http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/22/how-to-implement-hmac-authentication-on-a-restful-wcf-service.aspx

我希望這可以幫助。祝你好運!!

+0

你提到了關於aspnetCompatibility的好處,但是我的wcf服務是separte項目,而不是在asp.net網站application.i中沒有使用表單身份驗證。我正在驗證數據庫級別的用戶。但有會話通過憑據。角色和頁面級訪問也在數據庫中。 – lourdhu 2010-08-25 14:07:43

+0

您不必在網站項目中擁有該服務。我在項目中的一些服務上使用了asp.net兼容性,而我的服務位於Web項目引用的單獨的DLL中。 – 2010-08-25 17:20:58

+0

David,具有兼容性模式是一個好主意,並提供對HttpContext的訪問,但是它並不妨礙您在未經身份驗證時調用該服務。 – Ehsan 2014-06-20 18:59:11

0

用於WCF Web http服務保護Web端點的唯一方法是使用傳輸安全性通過HTTPS公開它。當使用基於消息的安全性時,安全信息通常放在SOAP頭中,並且因爲發送到非SOAP端點的消息不包含SOAP信封,所以無處放置安全信息,並且您必須依賴傳輸安全性。

2

我不確定這是否會有所幫助,但我在我的WCF和webapp之間放置了一層。我會做一個AJAX servicereference調用本地asmx。這受到表單身份驗證票證的保護。然後,asmx會進行任何進一步的安全檢查(如果允許該呼叫的特定用戶請求該數據或基於該用戶對數據進行整形),然後將該呼叫轉發給我的WCF服務。

這樣,我的服務層不需要知道每個訪問它的應用程序的用戶,只需要關心傳送所請求的數據。

asmx webservice承擔了安全責任。

然後我使用WAS在IIS中託管WCF,並且只允許對Windows應用程序池運行時的身份進行Windows身份驗證訪問。

所以:

ASPX - > ASMX WebService的 - > WCF

我認爲這會給你的控制/隔離和安全你所要求的?

相關問題