繁体   English   中英

WebMatrix.WebData.WebSecurity - 如何只通过PasswordResetToken获取UserName

[英]WebMatrix.WebData.WebSecurity - How can I get UserName by only having PasswordResetToken

我只是想请求帮助以使我的方案工作? 我想使用PasswordResetToken获取UserName。

这是我的情景。

  1. 我的网站上有一个忘记密码的功能,它会向用户发送一个密码重置电子邮件密码。
  2. 我只想发送passwordresettoken字符串。
  3. 当用户单击链接时。 我将只查询请求[“token”]以获取用户名,然后将允许用户更改密码和自动登录。

    这是我的代码如下:

     public ActionResult ChangePassword() { ChangePasswordModel model = new ChangePasswordModel(); string token=string.Empty; try { token = Request["token"].ToString(); int userId = WebSecurity.GetUserIdFromPasswordResetToken(token); if (userId > 0) { //Get the user object by (userid) //??????????????????? //??????????????????? } else { throw new Exception("The change password token has expired. Please go to login page and click forgot password again."); } } catch { model.HasError = true; ModelState.AddModelError("", "The change password token has expired. Please go to login page and click forgot password again."); } return View(model); } 

先感谢您。

请看本文末尾的注释: WebSecurity.GeneratePasswordResetToken方法

为方便起见,我会复制相关部分:

如果用户忘记了密码,他们可以申请新密码。 要提供新密码,请执行以下操作:

  1. 创建一个密码重置页面,其中包含一个用户可以输入其电子邮件地址的字段。
  2. 当用户在密码重置页面中输入了他或她的电子邮件地址时,请验证该电子邮件地址是否代表有效用户。 如果是,则通过调用GeneratePasswordResetToken(String,Int32)方法生成密码重置令牌。
  3. 创建指向站点中的确认页面的超链接,该超链接将令牌作为查询字符串参数包含在链接的URL中。
  4. 通过电子邮件将链接发送给用户。 当用户收到电子邮件消息时,他或她可以单击该链接以调用确认页面。
  5. 创建一个确认页面,该页面从URL参数中提取令牌,并允许用户输入新密码。
  6. 当用户提交新密码时,请调用ResetPassword(String,String)方法并传递密码重置令牌和新密码。 如果令牌有效,密码将被重置。 如果令牌无效(例如,它已过期),则显示错误消息。

突出显示是我的。 基本上你不需要用户名。 该框架为您完成了所有繁重的工作。

解决你的评论,我不建议自动登录用户。这是一个很好的做法,他们手动记录检查这个密码更改的东西实际上是否有效,而不是发现它不仅仅是下一次。

无论如何,你可以这样做:

SimpleMembershipProvider provider = (SimpleMembershipProvider)Membership.Provider;
string username = provider.GetUserNameFromId(userId);

参考: GetUserNameFromId

我认为WebSecurity.GetUserIdFromPasswordResetToken(string token)方法WebSecurity.GetUserIdFromPasswordResetToken(string token)你的需要。

更多信息在这里

更新

抱歉,我没有看到您已经在使用该方法...因此,如果您想获取用户名并且您正在使用代码首次迁移Entity Framework,您可以使用以下LINQ表达式获取用户名:

string username = yourDbContext.UserProfiles.FirstOrDefault(up=>up.UserId == userId).Username;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM