2013-06-05 29 views
2

请参阅以下更新:如何允许未经身份验证的用户重置密码?

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

我可以创建存储过程和使用字符串构建的电子邮件,但我不知道如何让没有认证用户更改密码。有没有一种方法可以让用户在点击链接时进行身份验证。我不知道怎么问这个。

感谢您阅读:

更新:

好吧,我设法拿到了密码使用此代码复位:

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配置文件。

我真的很想将安全问题作为用户的选择,以便通过电子邮件或安全问题进行验证。如果这是不可能的,我将不得不创建某种帐号或用户标识(不是成员身份用户标识)作为替代。

回答

5

我的答案不是特定于会员提供商,但希望能指出你在正确的方向。通常情况下,这种方法是生成一个非常长的随机字符串,称为令牌。你给他们,其中包括此令牌作为参数,就像一个链接:

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

你的应用程序里面你跟踪你已经生成的令牌。如果您收到包含该令牌的请求,则认证它,就好像它是该用户一样。

一对夫妇的注意事项:

  • 产生应该是随机的,并在短时间内有效地不可猜测的标记。
  • 令牌只能在生成后的短时间内工作,理想情况下比猜测时间短。
  • 令牌应该只能使用一次。一旦用户使用它更改了密码,请将其从系统中删除。
+1

谢谢克里斯,我没有想到这个:那么我如何验证令牌?我相信我可以生成一个GUID并将其哈希。一旦我知道如何验证令牌,我就可以做到这一点。示例:我可以创建一个允许用户输入电子邮件或安全问题的文本框。如果它匹配一个GUID生成,验证并通过电子邮件发送给用户? – Asynchronous

+0

这仅适用于存储唯一电子邮件的情况。当用户要求重置密码时,您需要提供电子邮件并将令牌发送至电子邮件并将该对(电子邮件,令牌)存储在某处。然后,当令牌回来时,您只需阅读电子邮件,然后获得用户。 –

+0

是的,我只使用唯一的电子邮件,不能重复*请参阅上面的更新。 – Asynchronous

0

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

您可以使用sql表进行令牌管理。令牌可以是唯一的UserId或Email。用于重置电子邮件的链接,如http://test.com/reset?id=sfksdfh-24204_23h7823。 网址中的ID是经过加密的Userid或Email,只要你喜欢。

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

+0

Sehta,所以如果令牌在数据库中,我如何验证它?正如我上面所解释的,我可以创建一个要求发送电子邮件的文本框。如果电子邮件与用户记录匹配,则会从数据库中获取令牌并通过电子邮件发送给用户。现在; a)我使用哪种方法可以让密码发生变化,以及如何验证令牌? – Asynchronous

+0

解密令牌。从Db acc获取令牌详细信息。到UserId或Email,即包含在URL中。如果此令牌与来自url的令牌匹配。授予更改密码的权限。使用电子邮件从数据库获取Memebership详细信息。并使用ChangePassword方法。 –

相关问题