C# WebMatrix.WebData.WebSecurity-如何仅通过PasswordResetToken获取用户名

C# WebMatrix.WebData.WebSecurity-如何仅通过PasswordResetToken获取用户名,c#,asp.net-mvc,membership-provider,C#,Asp.net Mvc,Membership Provider,我只是想寻求帮助来完成我的剧本?我想使用PasswordResetToken获取用户名 这是我的设想 我的网站上有一个忘记密码的功能,可以向用户发送passwordresettoken电子邮件更改密码 我只想发送passwordresettoken字符串 当用户单击链接时。我只需查询请求[“令牌”]以获取用户名,然后允许用户更改密码和自动登录 下面是我的代码: public ActionResult ChangePassword() { ChangePasswordModel model

我只是想寻求帮助来完成我的剧本?我想使用PasswordResetToken获取用户名

这是我的设想

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

    下面是我的代码:

    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);
    }
    

  • 提前谢谢。

    请看本文末尾的备注:

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

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

  • 创建一个密码重置页面,该页面有一个用户可以输入其电子邮件地址的字段
  • 当用户在“密码重置”页面中输入其电子邮件地址时,请验证该电子邮件地址是否代表有效密码 用户。如果是,则通过调用 GeneratePasswordResetToken(字符串,Int32)方法
  • 创建一个超链接,该超链接指向站点中的确认页面,并将令牌作为查询字符串参数包含在链接的 网址
  • 通过电子邮件将链接发送给用户。当用户收到电子邮件时,他或她可以单击链接调用 确认页
  • 创建一个确认页面,从URL参数中提取令牌,并允许用户输入新密码
  • 当用户提交新密码时,调用ResetPassword(String,String)方法并传递密码重置令牌 和新密码。如果令牌有效,则密码将为 重置。如果令牌无效(例如,它已过期), 显示错误消息
  • 这是我的。基本上,您不需要用户名。框架为您完成所有繁重的工作

    针对您的评论,我不建议用户自动登录。这是一个很好的做法,让他们手动登录来检查这个密码更改的东西是否真的起作用了,而不是仅仅在下次才发现它起作用了

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

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

    参考:。

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

    更多信息

    更新

    对不起,我没看到你已经在用那种方法。。。因此,如果您想要获取用户名,并且正在使用Entity Framework的代码优先迁移,则可以使用以下LINQ表达式获取用户名:

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

    嗨,泽斯里,谢谢你的及时回复。但我希望用户在更改密码后登录。回答很好,这正是我想要的-+1!