“您的登录尝试不成功。请重试。” - ASP.NET 登录控件。
本文将讨论一些针对错误“您的登录尝试不成功。请重试。”的预防/修复措施。

引言
如果您使用 ASP.NET membership 和登录控件进行开发,您将会看到上图所示的错误。本文将讨论如何预防和/或修复此问题。
背景
通常,我看到当开发人员使用 ASP.NET membership provider 和登录控件时,他们会遇到此错误。他们会抱怨
- 数据库里有用户,但我仍然无法登录。
- 在本地机器上可以正常工作,但部署到托管环境后,就无法登录了。
-
等等。
因此,我将讨论一些我从自身经验以及他人经验中总结出来的要点。
注意:我在此假设您正在使用 aspnetdb 或者使用 aspnet_regsql.exe 创建了默认的 membership 数据库。我将尽量明确指出自定义数据模式的情况。
用户特定详情
检查密码
- 密码错误:人们经常会认为自己输入了正确的密码,但实际上并没有。因此,请确保您输入了正确的密码。如果您对此有任何疑问,请创建一个新的测试用户,记下密码,并确保您在尝试登录时输入的就是这个密码。
- 修剪密码:其次,有时在调试时,您可能会在代码隐藏中看到您输入的密码与
Login1.Password
的值相同,并且看起来是正确的。但事实可能并非如此。假设您从文件或其他地方复制/粘贴密码,在复制时意外地添加了一个空格。因此,在将密码传递给Membership.Validate
方法之前,请对其进行 修剪。
检查用户名
- 与上面的密码规则相同。
检查 membership 数据库表中的以下项。
aspnet_Users 表
- 检查用户是否存在,即
UserName
aspnet_Membership 表
IsApproved
设置为True
-
IsLockedOut
设置为False
Membership Provider 特定设置问题
applicationName 属性
- 检查 web.config 中是否为您的 membership provider 设置了
applicationName
属性。 - 如果您没有配置 web.config,则意味着您的应用程序正在使用 machine.config 中的默认 membership provider 设置。并且
applicationName
已经设置为 ‘/’。所以这不应该是个问题。您仍然可以检查aspnet_Applications
表,查看应用程序名称是否存在。
注意:查看 为什么应该设置此项?
passwordFormat 属性
- 有三种设置:0=Clear(明文),1=Hashed(哈希)和 2=Encrypted(加密)。比较您的 web.config 和
aspnet_Users
表,检查用户创建时使用的passwordFormat
是否与 web.config 中指定的相同。在开发和生产环境中没有进行更改。因为有时您可能会使用 Clear 创建用户,然后决定更改为 Hash。
HashAlgorithmType 属性
-
如果您的
passwordFormat = Hashed
(即 =1),请检查开发机器和托管机器上用于哈希的算法类型是否有变化。您可以使用以下代码片段快速检查
protected void Page_Load(object sender, EventArgs e) { Response.Write (Membership.HashAlgorithmType); }
- 现在,如果它们相同,则不是问题,但如果不相同,该怎么办。如果 web.config 中没有明确设置
HashAlgorithmType
,membership provider 将从<machineKey>
元素的 validation 属性值中获取。此默认值为SHA1
。因此,您需要显式设置此项。
<membership hashAlgorithmType="SHA1">
<providers>....</providers>
</membership>
在 web.config 中设置 Membership Provider
- 如果您在 web.config 中设置了自定义 provider 设置,则需要注意以下加粗的设置。设置 defaultprovider 值。当您有多个 provider 时,这将非常有用。
<clear />
将有助于 membership provider 不会与 machine.config 或其他任何地方的其他 provider 混淆。- 始终设置
applicationName
属性。
<membership defaultProvider="AspNetSqlMembershipProvider">
<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>
数据库相关设置
Connectionstring
connectionstringName = LocalSqlServer
:如果您的 web.config 中的connectionstring
名称是 ‘LocalSqlServer
’,请不要忘记添加如下所示的 remove 标签
<connectionStrings>
<remove name="LocalSqlServer"/>
<add name="LocalSqlServer" connectionString="....."/>
</connectionStrings>
注意:我总是会使用一个唯一的名称而不是 ‘LocalSqlServer
” 作为我的 connectionstring
名称。这将自动清除任何混淆。例如
<connectionStrings>
<clear />
<add name="MembershipProvider" connectionString="....."/>
</connectionStrings>
然后,如下配置我的 membership provider
<membership defaultprovider=”..”>
<providers>
<clear/>
<add name="...”
...
...
connectionStringName="MembershipProvider"
</providers>
</membership>
其他原因 / 清单 / 故障排除
您是否使用了 Login Control 的 Authenticate 事件
如果您调用了 Membership.ValidateUser
方法或其他身份验证机制,请不要忘记像下面这样设置 e.Authenticate
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) {
if (Membership.ValidateUser(Login1.UserName, Login1.Password)) {
e.Authenticated = true; }
else{e.Authenticated = false; }}
或者
您是否有空的 Login Authenticate 事件结构
//Remove any such empty structure for Login Authenticate event
protected void myLogin1_Authenticate(object sender, AuthenticateEventArgs e)
{
}
结束语
以上是我从我的实验、文章和其他论坛中收集到的关于此错误的所有信息。如果存在任何错误或遗漏了好的内容,请指出,以便其他人可以在一个地方找到解决方案。非常感谢那些通过他们的经验帮助我撰写本文的开发人员,特别是 www.asp.net 论坛上的社区。
资源
查看这些论坛帖子和其他链接,它们可能会帮助您更深入地理解。