我有一个ASP.Core应用程序。我添加了身份。然后,我对其进行了自定义,我复制了现有逻辑,以向另一目录中的另一个模型发送验证电子邮件。
自动生成的脚本创建了一个Areas / Identity目录。在该目录下,有Pages / Account / Manage / Index.cshtml.cs文件。此文件夹中的代码使用相同的调用来生成确认电子邮件代码。很好。
但是,当我调用Url.Page时,自定义模型返回null。我不知道为什么。以下是我如何在startup.cs中自定义身份
services.AddIdentity<WebUser, WebRole>()
.AddEntityFrameworkStores<MyIdentityDbContext>()
.AddDefaultTokenProviders()
.AddDefaultUI();
这是尝试使用现有的Identity框架获取Page位置时中断的地方。 Url.Page返回null。
var userId = await _userManager.GetUserIdAsync(user);
var email = await _userManager.GetEmailAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { userId = userId, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(
email,
"Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
为什么从不同的模型调用URL.Page会产生这种差异?我想我在路由的工作方式上缺少一些基本知识,但不确定是什么。
答案 0 :(得分:0)
我遇到了同样的问题,直到我意识到我的项目中没有ConfirmEmail.cshtml
和ConfirmEmail.cshtml.cs
。
要仅从脚手架添加这些文件,请运行以下命令:
dotnet aspnet-codegenerator identity -dc <Your Context> --files "Account.AccessDenied"
我希望对您有帮助
答案 1 :(得分:0)
您需要在values参数中添加 area =“ Identity” 。
最终的callbackUrl代码如下所示:
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area="Identity", userId = userId, code = code },
protocol: Request.Scheme);