2

请参阅下面的更新:

我正在使用ASP.NET SQL Membership Provider

到目前为止,我能够允许用户更改他们的密码,但前提是他们经过身份验证或登录到应用程序。我真正需要的是让用户能够在电子邮件中获得链接。他们可以单击此链接并重置密码。

示例:假设用户忘记了他或她的密码,他们可以访问一个页面,他们可以输入安全问题和答案;或他们存档的电子邮件地址。然后,他们将收到一封电子邮件,其中包含重置密码的链接。

到目前为止,我所拥有的是:它只允许经过身份验证的用户重置他们的密码:

我不想使用生成密码的恢复控制。

public void ChangePassword_OnClick(object sender, EventArgs args)
{

MembershipUser user = Membership.GetUser(User.Identity.IsAuthenticated);

try
{
if (user.ChangePassword(OldPasswordTextbox.Text, PasswordTextbox.Text))
{
Msg.Text = "Password changed.";
}
else
{
Msg.Text = "Password change failed. Please re-enter your values and try again.";
}
}
catch (Exception e)
{
Msg.Text = "An exception occurred: " + Server.HtmlEncode(e.Message) + ". 
try again.";
  }
 }

我可以使用字符串生成器创建存储过程和电子邮件,但我不知道如何让未经身份验证的用户更改密码。当用户单击链接时,是否有办法对用户进行身份验证。我什至不知道如何问这个。

谢谢阅读:

更新:

好的,我设法使用以下代码获取重置密码:

protected void btnResetPassword_Click(object sender, EventArgs e)
{
  string username = "ApplePie12";
  MembershipUser currentUser = Membership.GetUser(username);
  currentUser.ChangePassword(currentUser.ResetPassword(), txtResetPassword.Text);
}

这是我的计划:

  1. 将此页面设为公开,以便未经身份验证的用户可以访问,但只能通过电子邮件链接访问。

  2. 创建一个存储过程,通过用户输入的用户名或安全问题/答案来验证用户是否存在。

  3. 如果它们存在,则会向它们发送一个包含令牌/GUID 的链接

  4. 最后,当他们单击链接时,他们将登陆此页面,要求他们更改密码。*链接一经使用即失效。

我唯一的问题是:执行上述所有操作需要在 Web Config 文件中使用安全问题/答案关闭。

我真的很想将安全问题作为用户通过电子邮件或安全问题进行验证的选项。如果这不可能,我将不得不创建某种帐号或用户 ID (不是会员用户 ID)作为替代方案。

4

2 回答 2

5

我的回答并非针对会员提供者,但希望能为您指明正确的方向。通常解决这个问题的方法是生成一个非常长的随机字符串,称为token。您向他们发送包含此令牌作为参数的链接,例如:

http://foo.bar/reset?token=asldkfj209jfpkjsaofiu029j3rjs-09djf09j1pjkfjsodifu091jkjslkhfao

在您的应用程序中,您可以跟踪您生成的令牌。如果您收到包含该令牌的请求,您将对其进行身份验证,就好像它是该用户一样。

几点注意事项:

  • 生成的令牌应该是随机的,并且在短时间内有效地不可猜测。
  • 令牌应该只在生成后的短时间内工作,理想情况下比猜测它所需的时间更短。
  • 令牌应该只能使用一次。一旦用户使用它更改了密码,请将其从系统中删除。
于 2013-06-05T05:15:17.830 回答
0

克里斯已经给出了绝对正确的解决方案。

您可以使用 sql 表进行令牌管理。令牌可能是唯一的 UserId 或 Email。用于重置电子邮件的链接,例如http://test.com/reset?id=sfksdfh-24204_23h7823。url 中的 id 可以根据需要加密 Userid 或 Email。

根据 Url 中的 id 从表中获取详细信息。如果 id 包含在数据库中。然后重置用户的密码。并从数据库中删除该令牌。

于 2013-06-05T05:53:15.653 回答