URL.Page为ASP.Core身份返回null

时间:2018-08-13 16:40:48

标签: razor asp.net-core asp.net-identity asp.net-core-2.0

我有一个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会产生这种差异?我想我在路由的工作方式上缺少一些基本知识,但不确定是什么。

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,直到我意识到我的项目中没有ConfirmEmail.cshtmlConfirmEmail.cshtml.cs。 要仅从脚手架添加这些文件,请运行以下命令:

dotnet aspnet-codegenerator identity -dc <Your Context> --files "Account.AccessDenied"

来源:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.2&tabs=netcore-cli

我希望对您有帮助

答案 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);