6

我只是想寻求帮助以使我的场景工作?我想使用 PasswordResetToken 获取用户名。

这是我的场景。

  1. 我的网站中有一个忘记密码功能,它会向用户发送密码重置令牌电子邮件更改密码。
  2. 我只想发送密码重置令牌字符串。
  3. 当用户点击链接时。我将只查询 request["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 回答 2

9

看文末的备注:WebSecurity.GeneratePasswordResetToken Method

为了您的方便,我将复制相关部分:

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

  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

于 2013-02-21T03:44:02.937 回答
1

我认为该WebSecurity.GetUserIdFromPasswordResetToken(string token)方法可以满足您的要求。

更多信息在这里

更新

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

string username = yourDbContext.UserProfiles.FirstOrDefault(up=>up.UserId == userId).Username;
于 2013-06-14T17:39:03.927 回答