在MVC 5中确认电子邮件

时间:2018-02-21 10:14:05

标签: c# .net asp.net-mvc asp.net-mvc-5 asp.net-web-api2

我正在尝试从我的API发送确认电子邮件。邮件发送没有问题。

当我从MVC5加载网址时,出现此错误:

enter image description here

我试过了:

Asp.NET Identity 2 giving "Invalid Token" error

http://www.gunaatita.com/Blog/Invalid-Token-Error-on-Email-Confirmation-in-Aspnet-Identity/1056 - >我的api和我的MVC是在两台服务器上托管的两个项目,因此我尝试使用machineKey validationKey。

我使用的代码如下:

Web API

        if (!await db.Users.AnyAsync(c => c.Email == userRequest.Email)) return StatusCode(HttpStatusCode.NotFound);

        var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(userContext));
        userManager.UserTokenProvider = new TotpSecurityStampBasedTokenProvider<ApplicationUser, string>();

        var user = await userManager.FindByNameAsync(userRequest.Email);

        var userId = user.Id;
        var code = await userManager.GenerateEmailConfirmationTokenAsync(user.Id);

        var url = "MyUrl" + "/Account/ConfirmEmail?userId=" + userId + "&code=" + code;

MVC5

        if (userId == null || code == null)
        {
            return View("Error");
        }

        var result = await UserManager.ConfirmEmailAsync(userId, code);
        return View(result.Succeeded ? "ConfirmEmail" : "Error");

2 个答案:

答案 0 :(得分:0)

要使令牌确认生效,需要在“用户”表AspNetUsers中保存令牌

Web API

string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
user.ConfirmationToken = code;
UserManager.Update(user);

<强> MVC5

var result = await UserManager.ConfirmEmailAsync(userId, code);         
switch (result.Succeeded)
{
    case true:
    // Your code
    case false:
    //
    default:
    //
}

答案 1 :(得分:-1)

我认为它会抛出'invalid token',因为code参数对于querystring来说过于复杂(包含特殊字符)。所以它没有正确地重定向到页面。要解决这个问题:

string val = HttpServerUtility.UrlTokenEncode(Encoding.ASCII.GetBytes(code));

您可以使用此更改为“code”参数。