我想为新用户设置确认电子邮件。
[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中,它可以工作
答案 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”参数中的与号正在被编码。所以编码不是必需的,上面琼斯的答案是正确的。