【问题标题】:Check Password on SqlMembershipProvider bypassing IsApproved?绕过 IsApproved 检查 SqlMembershipProvider 上的密码?
【发布时间】:2013-06-26 11:09:21
【问题描述】:

在我正在处理的应用程序中,创建的用户在激活帐户之前不会获得批准。 IsApproved 标志设置为 false,直到它们被激活。

当他们提交激活时,我们希望在激活用户之前检查他们的密码是否有效,但如果用户未获得批准,Membership.ValidateUser(..) 将始终返回 false,因此似乎无法区分不正确的密码密码和未经批准的用户。

如何检查密码以验证未批准的用户?

到目前为止我看过的可能的解决方案:

  • 自定义成员资格提供程序:这需要做大量工作,破坏了在 .NET 中使用成员资格系统的全部意义,这是基本功能,必须有办法检查密码。
  • 短暂设置 IsApproved 标志并将其改回:这是非常不安全的。
  • 使用ChangePassword 更改为随机密码,然后再次返回,检查是否成功:这是一个令人讨厌的 hack,我真的不想这样做。
  • SqlMembershipProvider 上调用私有的CheckPassword 函数:方法是私有的,同样,我不想这样做。

还有其他方法吗?当然,这是任何具有激活等功能的全功能用户帐户系统都需要的标准功能。系统是否有比我正在做的更好的设计?我是否以错误的方式使用 IsApproved?

感谢您的帮助。

编辑:这似乎引起了一些混乱。我创建了一个用户帐户,它有一个满足复杂性要求的密码等。我想要做的是,当用户提交包含用户名和密码的表单时,检查他们提供的密码是否与密码匹配帐户。我只想知道他们是否提供了正确的密码。根据我对框架的调查,如果不检查他们的帐户是否处于活动状态,这似乎是不可能的

【问题讨论】:

  • 为什么要使用ValidateUser() 方法检查他们的密码是否有效?创建用户时(使用IsApproved = falseMembership 将始终验证密码。如果密码满足所有要求,则将添加用户。这应该会提示您密码是有效的。除非你对“valid”有不同的定义?
  • 创建用户验证密码是否满足特定要求。我想检查提交的密码是否是用户帐户的正确密码。
  • 在创建帐户之前应验证密码。现在你倒退了。 是否有理由在创建帐户之前不验证密码?例如密码不能是123456
  • 您使用什么标准来确定用户的密码是否正确?为什么不在创建帐户之前完成所有这些操作?也就是说,如果您不想使用 Membership Provider 给您的东西?
  • 我已经添加了对问题的说明。

标签: .net asp.net-mvc asp.net-membership sqlmembershipprovider


【解决方案1】:

现在我理解你了。我的建议是将他们的密码临时存储在Membership Profile 中并事先匹配。一旦匹配,激活帐户并清除Profile。注意:profile 会将password 存储在plain text 中。我也在做类似的事情。

【讨论】:

  • 感谢您的回答。我已经接受这似乎是唯一的方法。但我不会实现这个功能。在任何情况下,我绝对不会以纯文本形式存储密码,纯粹是原则上的,更不用说因为项目的要求了。我可以手动对密码进行哈希+加盐并存储在MembershipProfile 中,但到那时我真的开始在SqlMembershipProvider 中重新实现功能。最终,MS 需要为此提供更好的 API,这是正常行为,而不是边缘情况。
  • 我同意你的观点。我已经做了类似的事情,但是从 ColdFusion 方面我对密码进行哈希+加盐,然后与成员资格表进行直接比较。
  • 一个简单的补充是加密配置文件表中的密码。
  • 你不会想要加密密码,散列它会更安全。
  • 我试图说明的一点是,与其直接使用会员密码,不如在配置文件中存储一个“安全”密码,然后从那里读取它,这比散列然后比较简单它与会员表。
猜你喜欢
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多