65.9K
CodeProject 正在变化。 阅读更多。
Home

“您的登录尝试不成功。请重试。” - ASP.NET 登录控件。

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.88/5 (9投票s)

2008 年 7 月 10 日

CPOL

4分钟阅读

viewsIcon

104030

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

引言

如果您使用 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.configaspnet_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 论坛上的社区。

资源

查看这些论坛帖子和其他链接,它们可能会帮助您更深入地理解。

© . All rights reserved.