摘要:[ASP.NET] 將Membership的Provider由ASPNETDB.MDF轉到SQL Server
以前有玩一下.NET內建的User和Role,
他會在你的專案下建一個App_Data資料夾,並在裡面建立一個 ASPNETDB.MDF的資料檔,
以前總覺得雖然方便,但是彈性實在不夠,所以很少使用,
前陣子想說把他轉移SQL Server中也許可以提高他的彈性,
所以我就用Visual Studio 的命令提示字元在SQL Server中建立資料檔 (參考),會在你的SQL Server中建立預設的資料庫ASPNETDB
然後在Web.config上面做一些修改,首先在ConnectionString上加上
<add name="myuserASPNET_conndb" connectionString="Data Source=xxxx;Initial Catalog=aspnetdb;User ID=xxx;Password=xxx;Min Pool Size=10;Max Pool Size=1000;Pooling=false;Connect Timeout=45;" providerName="System.Data.SqlClient" />
</connectionStrings>
一樣在Web.config的 <system.web> 中設定MemberShip的Provider(參考)
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="myuserASPNET_conndb"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="3"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
/>
</providers>
</membership>
然後在頁面使用CreateUserWizard 控制項來測試
<head runat="server">
<title>User Test</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server" BackColor="#F7F7DE"
BorderColor="#CCCC99" BorderStyle="Solid" BorderWidth="1px"
Font-Names="Verdana" Font-Size="10pt">
<SideBarStyle BackColor="#7C6F57" BorderWidth="0px" Font-Size="0.9em"
VerticalAlign="Top" />
<SideBarButtonStyle BorderWidth="0px" Font-Names="Verdana"
ForeColor="#FFFFFF" />
<ContinueButtonStyle BackColor="#FFFBFF" BorderColor="#CCCCCC"
BorderStyle="Solid" BorderWidth="1px" Font-Names="Verdana"
ForeColor="#284775" />
<NavigationButtonStyle BackColor="#FFFBFF" BorderColor="#CCCCCC"
BorderStyle="Solid" BorderWidth="1px" Font-Names="Verdana"
ForeColor="#284775" />
<HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="#FFFFFF"
HorizontalAlign="Center" />
<CreateUserButtonStyle BackColor="#FFFBFF" BorderColor="#CCCCCC"
BorderStyle="Solid" BorderWidth="1px" Font-Names="Verdana"
ForeColor="#284775" />
<TitleTextStyle BackColor="#6B696B" Font-Bold="True" ForeColor="#FFFFFF" />
<StepStyle BorderWidth="0px" />
<WizardSteps>
<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
</asp:CreateUserWizardStep>
<asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
</asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
</div>
</form>
</body>
</html>
沒意外的話應該會有錯誤訊息"'System.Web.Security.SqlMembershipProvider' 必須有與結構描述版本 '1' 相容的資料庫結構描述。但是,目前的資料庫結構描述與這個版本不相容。您可能需要安裝具有 aspnet_regsql.exe (可於 framework 安裝目錄中找到) 的相容結構描述,或者將提供者升級為更新的版本",如下
這問題是因為在Provider中的applicationName="/" 少了一個名稱,你可以命名你的名稱例如applicationName="/websiteUser",
但加上仍然會有錯誤訊息告訴你少了一個Procedure,
所以先把剛剛在資料庫中建立的aspnetdb刪掉,然後在Visual Studio 的命令提示字元輸入 "aspnet_regsql.exe"
接下來就依造下面的方式設定:
按完下一步後,就可以完成了,然後我們再重新整理頁面,就可以新增USER成功
然後看看資料庫中是否有資料