如何允许未经身份验证的用户重置密码?

时间:2013-06-05 05:04:15

标签: c# asp.net

请参阅下面的更新:

我正在使用 ASP.NET SQL成员资格提供程序

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

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

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

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

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.";
  }
 }

我可以使用String Builder创建商店流程和电子邮件,但我不知道如何让 未经身份验证的 用户更改密码。有没有办法让用户在单击链接时进行身份验证。我不知道怎么问这个。

感谢阅读:

更新

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

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. 的链接
  5. 最后,当他们点击链接时,他们将登陆此页面,要求他们更改密码。 * 链接一旦使用就会过期。

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

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

2 个答案:

答案 0 :(得分:5)

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

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

在您的应用程序中,您可以跟踪已生成的令牌。如果您收到包含该令牌的请求,则将其验证为该用户。

一对夫妇注意到:

  • 生成的令牌应该是随机的,并且可以在短时间内有效打开。
  • 令牌只能在生成后的短时间内工作,理想情况下比猜测时间短。
  • 令牌只能使用一次。用户使用密码更改密码后,将其从系统中删除。

答案 1 :(得分:0)

克里斯肯定给出了正确的解决方案。

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

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