2011年10月10日 星期一

會員登入機制:會員資料庫的轉移與資料存取方式

在使用ASP.NET組態設定時,我們新建了角色、使用者…讓我們快速的建置好會員登出登入機制,但這些資料被存取到哪裡呢?您可以注意一下你的專案或網站的根目錄裡,是否多了一個App_Data資料夾,裡頭放著的文件就是存取這些資料的資料庫
image

這樣的形式好像和我們一般先建立資料庫、再設計資料表、最後建置存取的網頁這種流程不大一致,因為ASP.NET組態後會幫我們先建置預設的資料表,項目非常多,這些都是為簡化我們設計資料表所產生。
image

不過這裡會產生幾個問題:

  1. 這種方式建立的資料庫,版本是MS SQL 2008 EXPRESS版本,這個免費版本是在建立Visual Studio時就會順便安裝的,雖能力足以應付很多中小企業的需求,也比Access強大,但是有「只支援單一cpu」「記憶體最大支援1GB」「採用MDF檔,最大的容量僅達4GB」等限制…不比我們安裝正式版SQL來得好。
  2. 資料庫是建置在App_Data資料夾下,如果我們不是自已架站而是承租網站空間的話,通常這樣是不被允許的。

所以dnowba在使用Visual Studio提供的會員機制時,會先將資料庫先移轉到正式的MS SQL資料庫中,再用ASP.NET組態來建置,中間的過程蠻繁瑣的,在這裡做個筆記,也順道說明一下資料新增的方式。


ASP.NET 附加資料庫轉移:使用Aspnet_reqsql.exe

我們使用了Framework 裡頭的「Aspnet_reqsql.exe」做為資料庫移轉的工具,目錄是在C:\Windows\Microsoft.NET\Framework\v2.0.50727image

附帶一提,不管是使用.NET 2.0或是3.5的版本,都是以2.0為基礎向上發展的,也因此許多工具和設定都是放在C:\Windows\Microsoft.NET\Framework\v2.0.50727這個目錄裡頭,這也再次說明了其實.NET在1.0和2.0架構上完全不同,而到了3.5、4.0,其實只是基於2.0做擴充和延伸 (從IIS裡的設定裡也可以得到這個結論,在設定時我們根本找不到4.0,只有1.X和2.0的選擇。)
image

image

執行這個檔案會出現安裝精靈,Aspnet_reqsql.exe這工具的用途上面寫得很清楚,這個軟體可以將ASP.NET的應用程式服務,如成員資格、設定檔、角色管理、個人化及SQL Web事件提供者等資料進行移轉,步驟如下圖。
image


web.config的設定:

移轉完後,在你指定的sql伺服器及資料庫中,就可以看到新的空白資料表,意味著在使用login控制項時,存取的地方會改成你設定的位置,我們再利用ASP.NET組態來建立使用者,但dnowba建議先設置好web.config,在web.config裡頭相關的設定如下:

  • 行1-4是Sql的連接字串,命名為ApplicationServices,這段不加入的話,預設還是引到App_Data下的express版本
  • 底下的三個標籤<membership>、<profile>、<roleManager>就是會員機制中使用控制項時會牽涉到的標籤。它們的connectionStringName都是ApplicationServices,所以在使用時都會呼叫新的資料庫連接字串,而三者中的<add name>標籤有共有4個applicationName,建議統一改成獨有的名稱,例如範例中改成「/dnowba」,這樣可以避免和別的專案重複而出錯。
  • 最後行37-39的<system.webServer>標籤內容一定要寫上,不然程式執行一定會報錯的。

<connectionStrings>
	<add name="ApplicationServices" connectionString="Data Source=SQL伺服器名稱;Persist Security Info=True;Persist Security Info=True;User ID=可存取SQL的帳號;Password=密碼"
   providerName="System.Data.SqlClient" />
</connectionStrings>
	
<system.web>
	<customErrors mode="Off"/>
	<authentication mode="Forms">
		<forms loginUrl="~/Login.aspx" />
  	</authentication>
       
       	 <compilation debug="false" strict="false" explicit="true" targetFramework="4.0" />
	<membership>
		<providers>
		<clear/>
		<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
      enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
      maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
      applicationName="/dnowba" />
		</providers>
	</membership>
	<profile>
		<providers>
		<clear/>
		<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/dnowba"/>
		</providers>
	</profile>
	<roleManager enabled="true">
		<providers>
		<clear/>
		<add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/dnowba" />
		<add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/dnowba" />
		</providers>
	</roleManager>
</system.web>

<system.webServer>
	<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
	

資料存取方式:

資料存取當然利用相應的login類別的控制項就可以完成任務,我們不妨用Sql Server Management Studio (需另外安裝)觀察一下這些資料表內容,才能知道要怎麼新增資料,學習一下專業的資料庫設計也不賴

aspnet_Roles是存放角色(群組)的資料表,由設計上來看,我們可以知道每個角色也有專屬的id,而且資料型別是用uniqueidentifier,uniqueidentifier 資料類型中儲存做為全域唯一識別碼 (GUID) 使用的 16 位元組二進位值。GUID 是一種唯一的二進位數字;全世界的電腦都不會產生重複的 GUID 值。GUID 的主要用途是在有許多站台與許多電腦的網路上指派一個唯一識別碼。image

aspnet_Users是存放使用者帳號(沒看到密碼= =)的地方
image

而這二個資料表則是由aspnet_UserInRoles資料表進行關聯
image

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...
// Dnow Function