WCF Membership Provider
??ASP.NET 是自.NET 1.x 就已經有的技術,利用IIS+ASP.NET 搭建的網站已經有很多。針對IIS+ASP.NET 的網站模型也有很多案例,通過現在的搜索服務我們可以很輕易的獲取這些內容。
? 大家可能很熟悉如何使用窗體認證,Windows認證,用戶名/密碼, SQL Server 等認證技術/服務來實現IIS + ASP.NET 站點的認證,而現在我們要討論的是如何使用ASP.NET 來對WCF 服務進行驗證。
? 現在,我們直接進入主題...
??我們要討論的模型簡化的說就是WCF + 證書 + 消息認證 + Membership Provider, 具體說來就是WCF服務使用證書對通信過程加密,然后服務端對消息解密并通過Membership Provider 對解密的消息(用戶名/密碼)進行驗證。
請看如下截圖:
?圖片1-1 WCF 消息認證 + SqlMembership Provider 認證
?
?接下來我們就如何構建WCF 消息認證 + SqlMembership Provider 認證給出一個具體的實施步驟。?
?
?第一步: 創建WCF IIS 服務
?創建一個新的網站->選擇 WCFService->將其命名為 service
?
?第二步: 配置Solution.
?
圖片1-2 Solution 配置
1 [ServiceContract]2 ?public interface IService
3 {
4 [OperationContract]
5 string GetData(int value);
6 [OperationContract]
7 CompositeType GetDataUsingDataContract(CompositeType composite);
8 ?// TODO: Add your service operations here
9 ?}
10 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
11 ?public class myService : IService
12 {
13 public string GetData(int value)
14 {
15 return string.Format("You entered: {0}", value);
16 }
17 }
第三步: 創建Form 認證數據庫(Membership Provider 使用表單認證模式)
? 轉到C:\WINDOWS\Microsoft.NET\Framework\<versionNumber>\aspnet_regsql.exe,雙擊運行aspnet_regsql.exe,
? 按步驟保留默認配置即可。
? 如果有不清楚的部分請參考http://msdn.microsoft.com/en-us/library/x28wfk74.aspx
??
?第四步: 創建證書
?我們借助Windows 自帶的Makecert.exe 證書生成工具生成證書。
?打開命令行窗口,輸入:
?makecert -r -pe -n "CN=www.yourserver.com" -b 01/01/2000 -e 01/01/2036 -eku 1.3.6.1.5.5.7.3.1
????????????? -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider"
????????????? -sy 12
?可以參考http://www.inventec.ch/chdh/notes/14.htm?
???
?第五步: 配置IIS Host?服務 web.config 文件
?首先是連接字符串部分:???
1 <connectionStrings>2 <clear />
3 <add name="LocalSqlServer" connectionString="Data Source=DANIELFACTORY2;
4 Initial Catalog=aspnetdb;Integrated Security=True" />
5 </connectionStrings>
注意要將連接字符串中對應的值更改,使其匹配個人環境配置,aspnetdb 為第三步生成的默認數據庫。
??
第六步: 在IIS Host 服務web.config 文件中創建Membership Provider
1 <membership defaultProvider="membership">2 <providers>
3 <add name="membership" type="System.Web.Security.SqlMembershipProvider,
4 System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
5 connectionStringName="LocalSqlServer" enablePasswordRetrieval="false"
6 enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/"
7 requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5"
8 minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1"
9 passwordAttemptWindow="10" passwordStrengthRegularExpression="" />
10 </providers>
11 </membership>
12 <authentication mode="Forms" />
也可以使用自定義SqlMembershipProvider,注意connectionStringName與第五步中創建的名字要匹配。
?
?第七步:?為IIS Host 服務配置完成的web.config 文件
???? 配置完成后要檢查以下幾項配置:
??1)消息認證類型(Message credential type) ==?UserName
??2)服務協商憑據(negotiate Service credential)?== false
??3)服務證書
??4)UserNameAuthentication->UserNamepasswordvalidatormode=MembershipProvider?
????? && MembershipProviderName == membership.
????? 在我的例子中 membership provider?的名字是membership.
??5) 檢查證書指紋
??????http://msdn.microsoft.com/en-us/library/ms734695.aspx.
? 6) 打開IIS Site Manager,為我們的IIS Host 服務新建一個站點。
?????
??? 圖片1-3 創建IIS Site
?? 7) 為我們的IIS Host Site 設定認證模式
??????
?
???
???圖片1-4 設置IIS Site 認證模式
??
?? 8) 確定服務已經成功啟動
?
?第八步: 創建一個新的控制臺應用程序作為客戶端
?
?第九步: 利用添加服務引用功能為客戶端添加服務引用
?
?圖片1-5 生成客戶端代理
?
?第十步: 客戶端代碼?????????
至此,你可以運行一下服務端和客戶端,初步看一下結果,但是很不幸,你會得到下面的錯誤:
?
? 圖片1-6 客戶端運行錯誤信息
?
? 說實話,產生這個錯誤的原因非常多,但從字面意思看是由于沒有建立安全連接導致的。實際上微軟為了防止攻擊者知道太多具體的錯誤信息,大多對類似的錯誤信息進行了包裝。
? 這個錯誤的真正原因可能是用戶名/密碼不正確,也可能是配置錯誤,但是如果直接報出用戶名不正確/密碼錯誤的異常信息,那么對攻擊者來說豈不是太方便了?!???
? 但是我們如何才能知道底層錯誤到底是由什么引起的呢?
? 其實,這個問題才是我們真正應該學習和了解掌握的,我們之前在服務端配置了診斷信息,所以現在我們可以到相關log 文件中找一下錯誤原因:
圖片1-7 WCF Membership Provider 具體驗證錯誤信息
?
? 這個錯誤說明我們在客戶端提供的用戶名/密碼驗證失敗。
? 那么我們現在需要想一下,到目前為止,除了在客戶端設置密碼以外,我們未曾在任何地方設置用戶名/密碼,那么問題可能是由于我們還未設置認證信息導致的,也就是說我們還沒有建立信息認證中心(這個稱呼著實有些大,很嚇人)。
? 回到之前,我們通過aspnet_regsql.exe 生成aspnetdb 的過程,打開這個數據庫我們就可以知道用戶名/密碼是存在這里面的,但是如何將用戶信息加入這個表內呢? 你是不是想通過SQL 語句? 哈哈,我一開始也是這么想的!
? 但是,不要忘了,我們現在還不了解這個數據庫中各個表項的關聯關系,這么加只會導致牛毛越來越多,那么如何解決問題呢?很遺憾,不要想著通過Google, Baidu 來搜索答案,這個問題在網上沒有任何有價值的信息,關鍵時刻還得靠我們自己!!!
現在,我們還是回到Visual Studio,執行如下操作:
圖片1-8 ASP.NET Configuration 配置
?
單擊圖片框中的圖標,我們將得到以下界面
圖片1-9 ASP.NET Site 配置界面
?
依次轉到Security->Users->Create User->創建用戶
圖片1-10 創建新用戶
?
?圖片1-11 用戶創建成功
?
接下來,好好享受你的WCF 之旅吧 :)
總結
以上是生活随笔為你收集整理的WCF Membership Provider的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 换个角度看敏捷1-敏捷问题解决方式
- 下一篇: IDEA9+Tomcat热部署配置二法