Asp net Core ConfirmEmail无法正常工作

时间:2017-08-26 18:31:20

标签: c# asp.net-core

我想为新用户设置确认电子邮件。

[HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> ConfirmEmail(string userId, string code)
    {
        if (userId == null || code == null)
        {
            return RedirectToAction(nameof(HomeController.Index), "Home");
        }
        var user = await _userManager.FindByIdAsync(userId);
        if (user == null)
        {
            throw new ApplicationException($"Unable to load user with ID '{userId}'.");
        }
        var result = await _userManager.ConfirmEmailAsync(user, code);
        return View(result.Succeeded ? "ConfirmEmail" : "Error");
    }

因此,当单击链接时进行调试时,userId是正常的,但是&#34;代码&#34;输入参数为空,所以

if (userId == null || code == null)

为真,然后执行

return RedirectToAction(nameof(HomeController.Index), "Home");

发送给注册用户的电子邮件如下:

点击此链接,请确认您的帐户:https://开头本地主机:44314 /帐号/ ConfirmEmail用户id = 3ec7ac6a-3329-4821-a09b-aa4843598eaa和放大器;代码= CfDJ8JouO%2BAfPaZIsebmFKKodcE1jEFscFSMcDTvnUPw88tqAKIh0%2BFV6X%2BWCF6fRBgprsymV37RsZsupPoRwCoj8tTT8CckBr0BP9se6DuBxd%2B8fDg2go2S0X9o%2FD9outoU7ShVJl3r3lM5yMXjevtJBoQha9g66ithx%? 2BhM4Dfskpzt79Imyad6BC0s8s53C7qGZhIx5Dh6DU2KXcVues8XxYQAAhFvzn%2BT49N3ze1%2BihB4Ciwxo5En6sT%2BmbaWvX9N2A%3D%3D&#39;&GT;链路

编辑:链接包含&amp; a m p;代码代替&amp;代码  但它不会在堆栈溢出中显示

字面上没有人在互联网上遇到同样的问题,所以我在这里迷路了。 我究竟做错了什么?

public static class UrlHelperExtensions
{
    public static string EmailConfirmationLink(this IUrlHelper urlHelper, string userId, string code, string scheme)
    {
        return urlHelper.Action(
            action: nameof(AccountController.ConfirmEmail),
            controller: "Account",
            values: new { userId, code },
            protocol: scheme);
    }

    public static string ResetPasswordCallbackLink(this IUrlHelper urlHelper, string userId, string code, string scheme)
    {
        return urlHelper.Action(
            action: nameof(AccountController.ResetPassword),
            controller: "Account",
            values: new { userId, code },
            protocol: scheme);
    }
}

更新:当我改变&amp; a m p;代码到&#34;&amp; code&#34;在链接中并将其粘贴在Chrome中,它可以工作

2 个答案:

答案 0 :(得分:4)

public static Task SendEmailConfirmationAsync(this IEmailSender emailSender, string email, string link)
    {
        return emailSender.SendEmailAsync(email, "Confirm your email",
            $"Please confirm your account by clicking this link: <a href='{HtmlEncoder.Default.Encode(link)}'>link</a>");
    }

问题出在这里

HtmlEncoder.Default.Encode(link)

只需将其移除即可使用

<a href='{link}'>link</a>

答案 1 :(得分:0)

如上代码:

HtmlEncoder.Default.Encode(link)

错了。我们不在这里编码 HTML。我们正在编码一个 url。有人会认为,因此,我们应该使用 url 编码。这:

HttpUtility.UrlEncode(link);

然而,看起来 Url.Page 足够聪明,可以自动编码参数。试试下面的代码:

var callbackUrl = Url.Page(
            "/Account/ConfirmEmail",
            pageHandler: null,
            values: new { area = "Identity", userId = "12345", code = 
"567&9", returnUrl = "/index" },
            protocol: Request.Scheme);

结果如下:

https://localhost:44383/Identity/Account/ConfirmEmail?userId=12345&code=567%269&returnUrl=%2Findex

如您所见,“code”参数中的与号正在被编码。所以编码不是必需的,上面琼斯的答案是正确的。