在ASP.NET Identity 2中找到生成的PasswordReset标记的位置?

时间:2016-01-21 19:11:09

标签: c# .net asp.net-mvc asp.net-identity-2 password-recovery

有没有办法在 ASP.NET Identity 2 中看到生成的密码重置令牌?
我的假设是TokenProvider中应该有一个字典,它将这些令牌保存在内存中。

更新:
这是一个类似的问题ResetPassword Token How and where is it stored?

  

"使用SecurityStamp生成令牌并进行验证   SecurityStamp并且不存储在数据库或本地文件中的任何位置   。存储"

但问题仍然是框架如何知道令牌何时过期而不存储它?

2 个答案:

答案 0 :(得分:3)

令牌不存储在内存中,而是由给定的 SecurityStamp 动态生成。令牌基本上是一个Unicode编码的字符串。

您可以看到UserManager.cs CreateSecurityTokenAsync 方法。

internal async Task<byte[]> CreateSecurityTokenAsync(TUser user)
{
    return Encoding.Unicode.GetBytes(await GetSecurityStampAsync(user));
}

答案 1 :(得分:1)

如其中一位评论者所述

“使用SecurityStamp生成令牌并根据SecurityStamp进行验证,而不是存储在数据库或本地文件存储中的任何位置。”

引自ResetPassword Token How and where is it stored?

以下是我能够持久保存令牌供以后使用的方法。

我假设您使用的是默认项目模板。

ApplicationUser中创建存储令牌的属性。

public class ApplicationUser : IdentityUser {
    public string EmailConfirmationToken { get; set; }
    public string ResetPasswordToken { get; set; }
}

AspNetUsers表中创建相应的列。

然后我按如下方式更新了ApplicationUserManager类。

    public override async System.Threading.Tasks.Task<string> GenerateEmailConfirmationTokenAsync(string userId) {
        /* NOTE:
         * The default UserTokenProvider generates tokens based on the users's SecurityStamp, 
         * so until that changes(like when the user's password changes), the tokens will always be the same, and remain valid. 
         * So if you want to simply invalidate old tokens, just call manager.UpdateSecurityStampAsync().
         */
        //await base.UpdateSecurityStampAsync(userId);

        var token = await base.GenerateEmailConfirmationTokenAsync(userId);
        //associate the email token with the user account
        if (!string.IsNullOrEmpty(token)) {
            var x = await FindByIdAsync(userId);
            x.EmailConfirmationToken = token;
            x.EmailConfirmed = false;

            await UpdateAsync(x);
        }

        return token;
    }

    public override async System.Threading.Tasks.Task<string> GeneratePasswordResetTokenAsync(string userId) {
        var token = await base.GeneratePasswordResetTokenAsync(userId);
        if (!string.IsNullOrEmpty(token)) {
            var x = await FindByIdAsync(userId);
            x.ResetPasswordToken = token;
            await UpdateAsync(x);
        }
        return token;
    }

    public override async System.Threading.Tasks.Task<IdentityResult> ConfirmEmailAsync(string userId, string token) {
        var result = await base.ConfirmEmailAsync(userId, token);
        if (result.Succeeded) {
            var x = await FindByIdAsync(userId);
            x.EmailConfirmationToken = null;
            await UpdateAsync(x);
        }
        return result;
    }

    public override async System.Threading.Tasks.Task<IdentityResult> ResetPasswordAsync(string userId, string token, string newPassword) {
        var result = await base.ResetPasswordAsync(userId, token, newPassword);
        if (result.Succeeded) {
            var x = await FindByIdAsync(userId);
            x.ResetPasswordToken = null;
            await UpdateAsync(x);
        }
        return result;
    }

上述更改使我可以在会话之间保留令牌。