自訂ASP.net 2.0 Membership的步驟,和entry 'AspNetSqlMembershipProvider' has already been added錯誤的解決
今天再新的系統裡面用上了membership這個功能,雖然很久以前就對他瞭解很多了,但是苦於公司裡面程式的局限性,一直都沒有機會使用它。今天再新的程式裡用上了,不過有一些東西微軟雖然考慮了很多嚴謹的配置,卻無形中給我們帶來了很大麻煩。例如使用者名稱密碼必須是那種強命名方式 最簡單的例子就是Pas$w0rd這個樣子,使得程式員們開發與測試的時候都是很麻煩,還有很多使用者還是很討厭這種註冊密碼的方式。我自己就是一個受害者,分析了一下membership,看了看msdn,這些限制都是我們可以自己定義的。下面是如何自訂的方法和一個討厭的錯誤解決辦法。
1. 首先,到C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG 下找到machine.config檔案,找到下面的這行配置 (當你找到他的時候,可能都寫成一行了,自己斷行符號修改成下面這種樣式更利於閱讀)
<membership>
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
</providers>
</membership>
2.當你拿到這個membership的配置以後,下一步就是把它拷貝到你自己的web.config的<system.web>這個模組下面。這裡需要稍微解釋一下,預設情況下,asp.net 2.0就預設調用machine.config的membership配置,這也就是為什麼你需要把這個配置拷貝到你自己的web.config下的原因,因為你要修改一些數值。
3. 好了開始大刀闊斧的"砍"吧.
<membership>
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="4"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
</providers>
</membership>
(紅色的部分就是我修改的),到了這裡已經差不多大功告成了,但是先別高興得太早,因為如果你這麼運行就會出現一個錯誤"The entry 'AspNetSqlMembershipProvider' has already been added."如果你看到了這個,那麼恭喜你,因為後面就是你要的答案。因為你在web.config裡面重寫membership的配置之後,asp.net還是先去運行machine.config裡面的membership配置,等回來讀到你的web.config的時候,asp.net engine就會糊塗了,因為有兩個membership配置出現了。這就是為什麼產生了這個錯誤。
好了廢話少說,解決問題。一句話,兩種辦法都可以解決。
在 <add name="AspNetSqlMembershipProvider" 前面加上
<remove name="AspNetSqlMembershipProvider"/>
或者
<clear/>
好了問題解決了