ASP.NET成員資格功能是爲了管理和授權用戶,常常與窗體認證搭配使用,還有一個驗證控件像Login,LoginVIew,LoginStatus,LoginName,PasswordRecovery, 和
CreateUserWizard控件。此篇文章教你如何通過很好的編輯配置文件和編寫membership 相關類的優化成員管理功能安全.
Securing Connections to a Membership Data Source
Connection Strings
To Keep the connection to your database server secure, you should encrypt connection-string information in the configuration using Protected Configuration. For more information, see Encrypting Configuration Information Using Protected Configuration.
不是每個配置節都是可以被保護配置的,而且在與加密與解密的過程中也是消耗系統性能。下面是我做一個測試的配置文件:
<connectionStrings configProtectionProvider="MichaelProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>GY5yyrC0LqaoybzzwQStVw9mYuAwPvBCuDY+wPkd8IhBrk9fILYl/iVcVz7aZotAmjQFhK0eXWpDyzFfNcjfHJ2DtFd3z8cN74OAVRW8aBhvUWG6b0T7U2I36Xgscf87CGGGD7ECJbFz6J/Ga/1o5V3aE3Vbdh2iTXhjmoKOtLk=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>h8JFEmdQhYujpVctO6kDPZWd4TEZubXw/4Ye7ZWWdvyb88jdVV8qxbl1vDCD5yfj6PAUQHr6y+tDDzJYVU/WBdAhR7MKTGzuEPDkTOfYn34fkK+PbUCWhnk9Zk1rbRjcAMTY+akmwhOiix6UIa3veBtggVsnjRzqsTkFOcnlySB3vU4jbZJEyJkYRhQ7gViJkYjggjkg7BLbd5l/J+njH0eID7reMsOYHOAD+o7QiglF3TtwdDFy0Rbq48+8A8zy</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
加密後的連接字符串與以往在後臺訪問的方法是一樣的,都是可以通過下面的方法來訪問的。當然在加密前自己還是要知道加密的連接字符串的關鍵字(DefaultConn)string connectStr = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DefaultConn"].ConnectionString;
系統會自動把配置文件中的加密內容解析出來。
下面的配置內容是針對使用了Membership, Role, Profile的功能配置的,爲了簡單沒有使用上面的加密配置方法加密連接字符串。
<!--defaultProvider:提供程序的名稱。默認爲AspNetSqlMembershipProvider.如果有多個Provider的話,指定一個默認值是明智的做法。
connectionStringName:Membership數據庫的連接名稱
enablePasswordRetrieval:指定當前成員資格提供程序是否配置爲允許用戶檢索密碼
enablePasswordReset:指定當前成員資格提供程序是否配置爲允許用戶重置密碼
requiresQuestionAndAnswer:指示默認成員資格提供程序是否要求用戶在進行密碼重置和檢索時回答密碼提示問題
applicationName:應用程序名稱
requiresUniqueEmail:指示成員資格程序是否配置爲要求每個用戶具有唯一的電子郵件地址
passwordFormat:指示成員資格數據存儲密碼的格式。值可選Clear,Encrypted,Hashed.
maxInvalidPasswordAttempts:鎖定成員資格用戶前允許的無效密碼或無效密碼提示問題答案嘗試次數
minRequiredPasswordLength:密碼所要求的最小長度
minRequiredNonalphanumericCharacters:有效密碼中必須包含的最少特殊字符數
passwordAttemptWindow:在鎖定成員資格用戶之前允許的最大無效密碼或無效密碼提示問題答案嘗試次數的分鐘數。這是爲了
防止不明來源反覆嘗試猜測成員資格用戶的密碼或密碼提示問題答案的額外措施。
passwordStrengthRegularExpression:計算密碼的正則表達式
-->
<membership defaultProvider="CustomSqlMembershipProvider">
<providers>
<add name="CustomSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="connstr"
enablePasswordRetrieval="false" enablePasswordReset="true"
requiresQuestionAndAnswer="false" applicationName="ScottsProject"
requiresUniqueEmail="true" passwordFormat="Hashed"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="3"
minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
<profile defaultProvider="CustomSqlProfileProvider">
<providers>
<add name="CustomSqlProfileProvider"
connectionStringName="connstr" applicationName="/"
type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</profile>
<roleManager enabled="true" defaultProvider="CustomSqlRoleProvider">
<providers>
<add connectionStringName="connstr" applicationName="/" name="CustomSqlRoleProvider"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add applicationName="/" name="CustomWindowsTokenRoleProvider"
type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
<authentication mode="Forms">
<forms defaultUrl="Default.aspx"
loginUrl="Login.aspx"
protection="All"
timeout="30"
path="/"
requireSSL="false"
slidingExpiration="false"
cookieless="UseDeviceProfile"
domain=""/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
通過這樣的配置就可以應用內置功能。可能有些剛接觸這些配置的人對上述配置不太瞭解,下面我們來講述一下authentication(認證)及authorization(授權)這兩個配置節的屬性描述讓大家瞭解每個配置屬性的意義及作用。
下面給一個authentication(認證)完全的配置
<authentication mode="Forms">
<forms defaultUrl="Default.aspx"
loginUrl="Login.aspx"
protection="All"
timeout="30"
path="/"
requireSSL="false"
slidingExpiration="false"
cookieless="UseDeviceProfile"
domain="">
<credentials passwordFormat="Clear" >
<user name="Micahael" password="123"/>
<user name="Jack" password="456"/>
</credentials>
</forms>
<passport redirectUrl="http://www.baidu.com"/>
</authentication>
屬性 | 選項 | 說明 |
mode | 控制應用程序的默認身份驗證模式。 | |
Windows | 將 Windows 驗證指定爲默認的身份驗證模式。當使用以下任意形式的 Microsoft Internet 信息服務 (IIS) 身份驗證時使用該模式:基本、簡要、集成的 Windows 驗證 (NTLM/Kerberos) 或證書。 | |
Forms | 將 ASP.NET 基於窗體的身份驗證指定爲默認的身份驗證模式。 | |
Passport | 將 Microsoft Passport 身份驗證指定爲默認的身份驗證模式。 | |
None | 不指定任何身份驗證。只有匿名用戶是預期的或者應用程序可以處理事件以提供其自身的身份驗證。 |
屬性 | 選項 | 說明 |
name | 指定要用於身份驗證的 HTTP Cookie。默認情況下,name 的值是 .ASPXAUTH。如果在單個服務器上正運行多個應用程序並且每一應用程序均要求唯一的 Cookie,則您必須在每一應用程序的 Web.config 文件中配置 Cookie 名稱。 | |
loginUrl | 指定如果沒有找到任何有效的身份驗證 Cookie,爲登錄將請求重定向到的 URL。默認值爲 default.aspx。 | |
protection | 指定 Cookie 使用的加密類型(如果有)。 | |
All | 指定應用程序同時使用數據驗證和加密來保護 Cookie。該選項使用已配置的數據驗證算法(基於 <machineKey> 元素)。如果三重 DES (3DES) 可用並且密鑰足夠長(48 位或更多),則使用三重 DES 進行加密。All 是默認(和建議)值。 | |
None | 指定對於將 Cookie 僅用於個性化並且具有較低的安全要求的站點而言,同時禁用加密和驗證。不推薦以此方式使用 Cookie;但是,這是使用 .NET Framework 啓用個性化的佔用資源最少的方式。 | |
Encryption | 指定使用三重 DES 或 DES 對 Cookie 進行加密,但不對該 Cookie 執行數據驗證。以此方式使用的 Cookie 可能會受到精選的純文本的攻擊。 | |
Validation | 指定驗證方案驗證已加密的 Cookie 的內容在轉換中是否未被改變。Cookie 是使用 Cookie 驗證創建的,方式是:將驗證密鑰和 Cookie 數據相連接,然後計算消息身份驗證代碼 (MAC),最後將 MAC 追加到輸出 Cookie。 | |
timeout | 指定以整數分鐘爲單位的時間量,超過此時間量,Cookie 將過期。默認值是 30。如果 SlidingExpiration 屬性爲true,則 timeout 屬性是一個彈性值,以收到最後一個請求後指定的分鐘數爲到期時間。爲避免危及性能,以及爲避免向啓用 Cookie 警告的用戶顯示多個瀏覽器警告,在經過了超過一半的指定時間後更新該 Cookie。這可能導致精確性上的損失。持久性 Cookie 不超時。 | |
path | 爲由應用程序發出的 Cookie 指定路徑。默認值是正斜槓 (/),這是因爲大多數瀏覽器是區分大小寫的,並且如果路徑大小寫不匹配,將不發送回 Cookie。 | |
requireSSL | 指定是否需要安全連接來轉換身份驗證 Cookie。 | |
true | 指定必須使用安全連接來保護用戶憑據。如果是 true, ASP.NET 爲身份驗證 Cookie 設置 HttpCookie.Secure,兼容的瀏覽器不返回 Cookie,並且除非連接使用的是安全套接字層 (SSL)。 | |
false | 指定在傳輸 Cookie 時,安全連接不是必需的。默認值爲 false。 | |
slidingExpiration | 指定是否啓用彈性過期時間。在單個會話期間,彈性過期時間針對每個請求重置當前身份驗證 Cookie 的過期時間。 | |
true | 指定啓用彈性過期時間。在單個會話期間,身份驗證 Cookie 被刷新,並且每個後續請求的到期時間被重置。ASP.NET 版本 1.0 的默認值爲 true。 | |
false | 指定不啓用彈性過期時間,並指定 Cookie 在最初發出之後,經過一段設定的時間間隔後失效。默認值爲 false。 |
Authorization配置節
authorization用於設置應用程序的授權策略,容許或拒絕不同用戶或角色訪問,該配置可以在計算機,站點,應用程序,子目錄或頁等級別上聲明必須與authentication配置節結合使用,“?”表示匿名(未經身份驗證的用戶)、“*”表示任何人,基本語法格式如下:
<pre name="code" class="html"> <authorization>
<deny users="?"/>
<allow users="Michael,Jack" roles="admin,user"/><!--用逗號分隔的用戶列表及角色列表-->
<allow roles=""/>
</authorization>
在我的工程目錄有這樣一個目錄,裏面的文件只允許管理員成員訪問,其它成員不能訪問。
在此目錄下創建配置文件,文件的內容如下:
<?xml version="1.0"?>
<configuration>
<system.web>
<!-- The authorization here allows only those users in the Administrator role to access the ASP.NET resources
in this folder... -->
<authorization>
<allow roles="Admin" />
<deny users="*" />
</authorization>
</system.web>
</configuration>