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

时间:2013-02-21 03:36:55

标签: c# asp.net-mvc membership-provider

我只是想请求帮助以使我的方案有效?我想使用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);
    }
    
  4. 提前谢谢。

2 个答案:

答案 0 :(得分:9)

请看本文末尾的评论:WebSecurity.GeneratePasswordResetToken Method

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

  

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

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

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

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

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

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

参考:GetUserNameFromId

答案 1 :(得分:1)

我认为WebSecurity.GetUserIdFromPasswordResetToken(string token)方法符合您的要求。

更多信息here

<强>更新

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

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