自定义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/>
好了问题解决了