http://www.sithere.net/article.asp?id=994.html
1.使用Login控件
添加Login,点击“管理网站”进入asp.net配置,在“安全”选项卡时可以添加用户和角色,和指定“提供程序”也就是provider.(其实同时如果是第一次的话,它会自动帮你建立一个名为aspnetdb.mdf的数据库,在app_data文件夹里面)
2.web.config的设置,如果是服务器的话也可以在machine.config改,但是建议在web.config改。改完后在asp.net配置中“安全”里面把提供程序选为自己的provider.
添加指向aspnetdb.mdf的连接串
程序代码
在<system>里面添加以下代码
程序代码
主要功能是自定义自己的membership和 rolemanager的provider,关键点有以下几个:
程序代码
http://lovewangshu.cnblogs.com/archive/2006/04/24/383513.html
PS:profile,webpart,rolemanage也要设置相同的applicationname!!!
3.关于passwordrecovery
要在web.config中添加以下 mailsetting
程序代码
使用不同的Providers的ASP.NET2.0时,需要使用 Aspnet_Regsql.exe ,具体位置,请查看我的Blog里面的其他文章
在配置使用Membership或其他的Providers的ASP.NET2.0时一定要设置applicationName属性
原文:Always set the "applicationName" property when configuring ASP.NET 2.0 Membership and other Providers
作者:Scott Guthrie
翻译:范维肖
注释:对于个别名词保留英文描述或翻译参考。
场景:
在本地开发一个asp.net2.0的应用程序时使用了Membership、Roles或Profile特性。你创建了一些新用户,一切都没有问题。
然后把这个程序copy到远程服务器(remote server)上(或者只是移动到你本地服务器上的其他目录)然后运行。由于某种原因,虽然我们能够连接到membership数据库,但是当登陆的时候就会出现错误了,它并不抛出连接错误(connection error),而是提示你像类似的错误:“尝试登陆失败,请重试”(Login attempt unsuccessful, please try again)
原因:
这种经常出现的错误的原因是因为membership(或者是roles、profile) provider已经被加入到了程序的web.config里了。但是applicationName属性(attribute)并没有被指定(假设下面的代码的粗体部分布存在地话)
程序代码
如果applicationName属性没有被配置的话,当往程序的数据库里添加数据的时候,asp.net会使用程序在web服务器里的虚拟目录路径(vroot Path)自动的计算applicationName的值。我们打开aspnetdb数据库,看aspnet_Applications表,就能了解这一行为:

这个表里为每个applicationName存储了一个具有唯一值(unique)的ApplicationID。因为在我们的程序里注册一个用户的时候并没有指定一个applicationName属性,所以它自动的被设置(计算)为/website8(早期建立项目时的名字)
然后,使用membership API创建的用户会与ApplicationID相关联,这样可以找到applicationName(and in turn the applicationName)。【这样做的目的可以让我们的多个应用程序和站点使用同一个数据库】。打开aspnet_Users表就可以可以看到这些。



如果把这个程序配置成运行在/website8虚拟目录下那么一切都没有问题。但是如果它被copy到其他的地方或服务器上并且更换了虚拟路径(比如说“/app1”或更通常被设置的“/”)后,当Membership APIs被使用时他们就“看”不到数据库里已有的用户了——因为他们将会使用一个不同的applicationName去数据库里寻找用户,相应地过滤application_Users表中的用户。这就是为什么会出现上面错误的原因。
如何解决这个问题:
最简单的办法是打开ASPNETDB数据库中的aspnet_Users和aspnet_Application表,去“回想”(figure out,因为那时候我们的虚拟目录叫什么名字我们恐怕已经忘了)创建用户和其他数据的时候的程序名称(去aspnet_Application表中查找)
然后打开你的web.config文件,添加一个applicationName属性到provider声明的地方并且给他赋值,例如,下面的代码我们把它设置为在aspnet_Application表存在的/website8:
程序代码
这样程序就能正常的工作,无论我们部署这个程序到那个虚拟目录。
当然,我们还要保证Roles、Profile、WebPartPersonalization或其他的我们配置的providers也要被配置了。
这样我们的程序可以正常工作了。
如果在一开始就避免它:
避免这个问题的最好的办法是始终设置applicationName的值。一个比较好的默认值是使用“/”。
1.使用Login控件
添加Login,点击“管理网站”进入asp.net配置,在“安全”选项卡时可以添加用户和角色,和指定“提供程序”也就是provider.(其实同时如果是第一次的话,它会自动帮你建立一个名为aspnetdb.mdf的数据库,在app_data文件夹里面)
2.web.config的设置,如果是服务器的话也可以在machine.config改,但是建议在web.config改。改完后在asp.net配置中“安全”里面把提供程序选为自己的provider.
添加指向aspnetdb.mdf的连接串

<connectionStrings>
<add name="SqlProviderconn" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<add name="SqlProviderconn" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
在<system>里面添加以下代码

<membership defaultProvider="SqlProvider"
userIsOnlineTimeWindow = "20">
<providers>
<add
name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SqlProviderconn"
requiresQuestionAndAnswer="true"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0"
applicationName="/gpglxt"
/>
</providers>
</membership>
<roleManager defaultProvider="myAspNetSqlRoleProvider" enabled="true">
<providers>
<add name="myAspNetSqlRoleProvider" connectionStringName="SqlProviderconn" applicationName="/gpglxt" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
userIsOnlineTimeWindow = "20">
<providers>
<add
name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SqlProviderconn"
requiresQuestionAndAnswer="true"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0"
applicationName="/gpglxt"
/>
</providers>
</membership>
<roleManager defaultProvider="myAspNetSqlRoleProvider" enabled="true">
<providers>
<add name="myAspNetSqlRoleProvider" connectionStringName="SqlProviderconn" applicationName="/gpglxt" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
主要功能是自定义自己的membership和 rolemanager的provider,关键点有以下几个:

minRequiredPasswordLength="6" //密码的最小位数,默认为7位
minRequiredNonalphanumericCharacters="0" //密码中必须的非数字与字符数的个数,默认为1,最好改为0,不然的话,密码就太复杂了,得要有*&%($$.,之类的才能通过。
applicationName //必须要有,不然发布之后会出现无法登录的情况,原因是因为改变了虚拟目录会产生不同的applicationName,详细见下面附文。
minRequiredNonalphanumericCharacters="0" //密码中必须的非数字与字符数的个数,默认为1,最好改为0,不然的话,密码就太复杂了,得要有*&%($$.,之类的才能通过。
applicationName //必须要有,不然发布之后会出现无法登录的情况,原因是因为改变了虚拟目录会产生不同的applicationName,详细见下面附文。
http://lovewangshu.cnblogs.com/archive/2006/04/24/383513.html
PS:profile,webpart,rolemanage也要设置相同的applicationname!!!
3.关于passwordrecovery
要在web.config中添加以下 mailsetting

<system.net>
<mailSettings>
<smtp from="你的邮件地址,如XXXX@126.com">
<network host="smtp.126.com" password="邮件地址的密码" userName="XXXX" />
</smtp>
</mailSettings>
</system.net>
<mailSettings>
<smtp from="你的邮件地址,如XXXX@126.com">
<network host="smtp.126.com" password="邮件地址的密码" userName="XXXX" />
</smtp>
</mailSettings>
</system.net>
使用不同的Providers的ASP.NET2.0时,需要使用 Aspnet_Regsql.exe ,具体位置,请查看我的Blog里面的其他文章
在配置使用Membership或其他的Providers的ASP.NET2.0时一定要设置applicationName属性
原文:Always set the "applicationName" property when configuring ASP.NET 2.0 Membership and other Providers
作者:Scott Guthrie
翻译:范维肖
注释:对于个别名词保留英文描述或翻译参考。
场景:
在本地开发一个asp.net2.0的应用程序时使用了Membership、Roles或Profile特性。你创建了一些新用户,一切都没有问题。
然后把这个程序copy到远程服务器(remote server)上(或者只是移动到你本地服务器上的其他目录)然后运行。由于某种原因,虽然我们能够连接到membership数据库,但是当登陆的时候就会出现错误了,它并不抛出连接错误(connection error),而是提示你像类似的错误:“尝试登陆失败,请重试”(Login attempt unsuccessful, please try again)
原因:
这种经常出现的错误的原因是因为membership(或者是roles、profile) provider已经被加入到了程序的web.config里了。但是applicationName属性(attribute)并没有被指定(假设下面的代码的粗体部分布存在地话)

<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
applicationName="/"
/>
</providers>
</membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
applicationName="/"
/>
</providers>
</membership>
如果applicationName属性没有被配置的话,当往程序的数据库里添加数据的时候,asp.net会使用程序在web服务器里的虚拟目录路径(vroot Path)自动的计算applicationName的值。我们打开aspnetdb数据库,看aspnet_Applications表,就能了解这一行为:

这个表里为每个applicationName存储了一个具有唯一值(unique)的ApplicationID。因为在我们的程序里注册一个用户的时候并没有指定一个applicationName属性,所以它自动的被设置(计算)为/website8(早期建立项目时的名字)
然后,使用membership API创建的用户会与ApplicationID相关联,这样可以找到applicationName(and in turn the applicationName)。【这样做的目的可以让我们的多个应用程序和站点使用同一个数据库】。打开aspnet_Users表就可以可以看到这些。



如果把这个程序配置成运行在/website8虚拟目录下那么一切都没有问题。但是如果它被copy到其他的地方或服务器上并且更换了虚拟路径(比如说“/app1”或更通常被设置的“/”)后,当Membership APIs被使用时他们就“看”不到数据库里已有的用户了——因为他们将会使用一个不同的applicationName去数据库里寻找用户,相应地过滤application_Users表中的用户。这就是为什么会出现上面错误的原因。
如何解决这个问题:
最简单的办法是打开ASPNETDB数据库中的aspnet_Users和aspnet_Application表,去“回想”(figure out,因为那时候我们的虚拟目录叫什么名字我们恐怕已经忘了)创建用户和其他数据的时候的程序名称(去aspnet_Application表中查找)
然后打开你的web.config文件,添加一个applicationName属性到provider声明的地方并且给他赋值,例如,下面的代码我们把它设置为在aspnet_Application表存在的/website8:

<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
applicationName="/website8"
/>
</providers>
</membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
applicationName="/website8"
/>
</providers>
</membership>
这样程序就能正常的工作,无论我们部署这个程序到那个虚拟目录。
当然,我们还要保证Roles、Profile、WebPartPersonalization或其他的我们配置的providers也要被配置了。
这样我们的程序可以正常工作了。
如果在一开始就避免它:
避免这个问题的最好的办法是始终设置applicationName的值。一个比较好的默认值是使用“/”。