确认电子邮件中的aspnet身份无效令牌

Thi*_*dio 15 asp.net-mvc-5 asp.net-identity asp.net-identity-2

我正在尝试确认帐户,但我收到"无效令牌".错误.

这是我正在尝试的:

var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var callbackUrl = Url.Action("ConfirmacaoEmail", "Usuario", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);

await UserManager.SendEmailAsync(user.Id, "Ativação de Conta", user.GetEmailAtivacao(model.Nome, callbackUrl));
Run Code Online (Sandbox Code Playgroud)

如果我UserManager.ConfirmEmailAsync在此代码后拨打电话,我可以确认该帐户.但是,如果我打开它在变量callbackUrl中的链接并尝试通过该操作确认,我收到错误.

我认为它可能是OwinContext的东西,所以我决定打电话HttpContext.GetOwinContext().GetUserManager<MyCustomUserService>但是我得到了同样的错误.

有线索吗?

tra*_*max 24

很可能是传输中的代码被浏览器修改.尝试在令牌上执行UrlEncode:

var code = await userManager.GenerateEmailConfirmationTokenAsync(userId);
code = System.Web.HttpUtility.UrlEncode(code);
Run Code Online (Sandbox Code Playgroud)

否则,浏览器会混淆令牌中可能出现的特殊符号.

  • 我必须将UrlDecode(代码)添加到ConfirmEmail操作才能使其正常工作. (4认同)

小智 22

我遇到了同样的问题.我用以下代码解决了这个问题.

样品:

var emailToken = _customManager.GenerateEmailConfirmationToken(userId);
emailToken = emailToken.Base64ForUrlEncode();
Run Code Online (Sandbox Code Playgroud)

扩展方法=>名称空间:System.Text,System.Web

public static class UrlEncoding
{
        public static string Base64ForUrlEncode(this string str)
        {
            byte[] encbuff = Encoding.UTF8.GetBytes(str);
            return HttpServerUtility.UrlTokenEncode(encbuff);
        }

        public static string Base64ForUrlDecode(this string str)
        {
            byte[] decbuff = HttpServerUtility.UrlTokenDecode(str);
            return Encoding.UTF8.GetString(decbuff);
        }
}
Run Code Online (Sandbox Code Playgroud)