WCF Membership Provider
??ASP.NET 是自.NET 1.x 就已經(jīng)有的技術(shù),利用IIS+ASP.NET 搭建的網(wǎng)站已經(jīng)有很多。針對(duì)IIS+ASP.NET 的網(wǎng)站模型也有很多案例,通過現(xiàn)在的搜索服務(wù)我們可以很輕易的獲取這些內(nèi)容。
? 大家可能很熟悉如何使用窗體認(rèn)證,Windows認(rèn)證,用戶名/密碼, SQL Server 等認(rèn)證技術(shù)/服務(wù)來實(shí)現(xiàn)IIS + ASP.NET 站點(diǎn)的認(rèn)證,而現(xiàn)在我們要討論的是如何使用ASP.NET 來對(duì)WCF 服務(wù)進(jìn)行驗(yàn)證。
? 現(xiàn)在,我們直接進(jìn)入主題...
??我們要討論的模型簡(jiǎn)化的說就是WCF + 證書 + 消息認(rèn)證 + Membership Provider, 具體說來就是WCF服務(wù)使用證書對(duì)通信過程加密,然后服務(wù)端對(duì)消息解密并通過Membership Provider 對(duì)解密的消息(用戶名/密碼)進(jìn)行驗(yàn)證。
請(qǐng)看如下截圖:
?圖片1-1 WCF 消息認(rèn)證 + SqlMembership Provider 認(rèn)證
?
?接下來我們就如何構(gòu)建WCF 消息認(rèn)證 + SqlMembership Provider 認(rèn)證給出一個(gè)具體的實(shí)施步驟。?
?
?第一步: 創(chuàng)建WCF IIS 服務(wù)
?創(chuàng)建一個(gè)新的網(wǎng)站->選擇 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 }
第三步: 創(chuàng)建Form 認(rèn)證數(shù)據(jù)庫(Membership Provider 使用表單認(rèn)證模式)
? 轉(zhuǎn)到C:\WINDOWS\Microsoft.NET\Framework\<versionNumber>\aspnet_regsql.exe,雙擊運(yùn)行aspnet_regsql.exe,
? 按步驟保留默認(rèn)配置即可。
? 如果有不清楚的部分請(qǐng)參考http://msdn.microsoft.com/en-us/library/x28wfk74.aspx
??
?第四步: 創(chuàng)建證書
?我們借助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?服務(wù) web.config 文件
?首先是連接字符串部分:???
1 <connectionStrings>2 <clear />
3 <add name="LocalSqlServer" connectionString="Data Source=DANIELFACTORY2;
4 Initial Catalog=aspnetdb;Integrated Security=True" />
5 </connectionStrings>
注意要將連接字符串中對(duì)應(yīng)的值更改,使其匹配個(gè)人環(huán)境配置,aspnetdb 為第三步生成的默認(rèn)數(shù)據(jù)庫。
??
第六步: 在IIS Host 服務(wù)web.config 文件中創(chuàng)建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與第五步中創(chuàng)建的名字要匹配。
?
?第七步:?為IIS Host 服務(wù)配置完成的web.config 文件
???? 配置完成后要檢查以下幾項(xiàng)配置:
??1)消息認(rèn)證類型(Message credential type) ==?UserName
??2)服務(wù)協(xié)商憑據(jù)(negotiate Service credential)?== false
??3)服務(wù)證書
??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 服務(wù)新建一個(gè)站點(diǎn)。
?????
??? 圖片1-3 創(chuàng)建IIS Site
?? 7) 為我們的IIS Host Site 設(shè)定認(rèn)證模式
??????
?
???
???圖片1-4 設(shè)置IIS Site 認(rèn)證模式
??
?? 8) 確定服務(wù)已經(jīng)成功啟動(dòng)
?
?第八步: 創(chuàng)建一個(gè)新的控制臺(tái)應(yīng)用程序作為客戶端
?
?第九步: 利用添加服務(wù)引用功能為客戶端添加服務(wù)引用
?
?圖片1-5 生成客戶端代理
?
?第十步: 客戶端代碼?????????
至此,你可以運(yùn)行一下服務(wù)端和客戶端,初步看一下結(jié)果,但是很不幸,你會(huì)得到下面的錯(cuò)誤:
?
? 圖片1-6 客戶端運(yùn)行錯(cuò)誤信息
?
? 說實(shí)話,產(chǎn)生這個(gè)錯(cuò)誤的原因非常多,但從字面意思看是由于沒有建立安全連接導(dǎo)致的。實(shí)際上微軟為了防止攻擊者知道太多具體的錯(cuò)誤信息,大多對(duì)類似的錯(cuò)誤信息進(jìn)行了包裝。
? 這個(gè)錯(cuò)誤的真正原因可能是用戶名/密碼不正確,也可能是配置錯(cuò)誤,但是如果直接報(bào)出用戶名不正確/密碼錯(cuò)誤的異常信息,那么對(duì)攻擊者來說豈不是太方便了?!???
? 但是我們?nèi)绾尾拍苤赖讓渝e(cuò)誤到底是由什么引起的呢?
? 其實(shí),這個(gè)問題才是我們真正應(yīng)該學(xué)習(xí)和了解掌握的,我們之前在服務(wù)端配置了診斷信息,所以現(xiàn)在我們可以到相關(guān)log 文件中找一下錯(cuò)誤原因:
圖片1-7 WCF Membership Provider 具體驗(yàn)證錯(cuò)誤信息
?
? 這個(gè)錯(cuò)誤說明我們?cè)诳蛻舳颂峁┑挠脩裘?密碼驗(yàn)證失敗。
? 那么我們現(xiàn)在需要想一下,到目前為止,除了在客戶端設(shè)置密碼以外,我們未曾在任何地方設(shè)置用戶名/密碼,那么問題可能是由于我們還未設(shè)置認(rèn)證信息導(dǎo)致的,也就是說我們還沒有建立信息認(rèn)證中心(這個(gè)稱呼著實(shí)有些大,很嚇人)。
? 回到之前,我們通過aspnet_regsql.exe 生成aspnetdb 的過程,打開這個(gè)數(shù)據(jù)庫我們就可以知道用戶名/密碼是存在這里面的,但是如何將用戶信息加入這個(gè)表內(nèi)呢? 你是不是想通過SQL 語句? 哈哈,我一開始也是這么想的!
? 但是,不要忘了,我們現(xiàn)在還不了解這個(gè)數(shù)據(jù)庫中各個(gè)表項(xiàng)的關(guān)聯(lián)關(guān)系,這么加只會(huì)導(dǎo)致牛毛越來越多,那么如何解決問題呢?很遺憾,不要想著通過Google, Baidu 來搜索答案,這個(gè)問題在網(wǎng)上沒有任何有價(jià)值的信息,關(guān)鍵時(shí)刻還得靠我們自己!!!
現(xiàn)在,我們還是回到Visual Studio,執(zhí)行如下操作:
圖片1-8 ASP.NET Configuration 配置
?
單擊圖片框中的圖標(biāo),我們將得到以下界面
圖片1-9 ASP.NET Site 配置界面
?
依次轉(zhuǎn)到Security->Users->Create User->創(chuàng)建用戶
圖片1-10 創(chuàng)建新用戶
?
?圖片1-11 用戶創(chuàng)建成功
?
接下來,好好享受你的WCF 之旅吧 :)
總結(jié)
以上是生活随笔為你收集整理的WCF Membership Provider的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 换个角度看敏捷1-敏捷问题解决方式
- 下一篇: 设计模式 – 策略模式(Strategy