【问题标题】:URL.Page returns null for ASP.Core IdentityURL.Page 为 ASP.Core 标识返回 null
【发布时间】:2019-01-20 10:57:33
【问题描述】:

我有一个 ASP.Core 应用程序。我添加了身份。然后我对其进行了自定义,我复制了现有的逻辑以将验证电子邮件发送到位于不同目录中的另一个模型。

自动生成的脚本创建了一个 Areas/Identity 目录。在该目录下,有 Pages/Account/Manage/Index.cshtml.cs 文件。此文件夹中的代码使用相同的调用来生成确认电子邮件代码。它工作正常。

但是,当我调用 Url.Page 时,自定义模型返回 null。我不确定为什么。以下是我在 startup.cs 中自定义身份的方式

services.AddIdentity<WebUser, WebRole>()
        .AddEntityFrameworkStores<MyIdentityDbContext>()
        .AddDefaultTokenProviders()
        .AddDefaultUI();

这是它尝试使用现有身份框架获取页面位置时中断的地方。 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 会产生这样的差异?我猜我遗漏了一些关于路由工作原理的基本知识,但不确定是什么。

【问题讨论】:

  • 你是什么意思但有时?您能否使用特定操作和用户帐户重现此问题?这些代码似乎没有错误。为什么要手动创建呢,建议你试试右键Project->Add->New Scaffold Item->Identity生成需要的文件。
  • 我已经使用 dotnet add identity 命令行自动创建了代码,但我已经复制了此代码以在不属于同一目录结构的其他地方使用。因此,自动代码生成有效,但是当我在另一个不在同一目录结构中的模块中使用它时,它不会。

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


【解决方案1】:

这是由于事实。脚手架身份使用称为身份的不同区域,因此要从不同位置调用它,您必须添加到

values= new {area = "Identity", userId = userId, code = code}

See this link on stackoverflow for more information.

【讨论】:

  • 在 Asp.Net Core 2.0 - 2.2 中工作
  • 这应该被标记为答案。在 Asp.Net Core 2.2 中为我工作
【解决方案2】:

我遇到了同样的问题,直到我意识到我的项目中没有 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

希望对你有帮助

【讨论】:

  • 这对我来说是个问题。虽然我只是右键单击该部分然后=>“添加”=>“新脚手架项目”
【解决方案3】:

您需要在 values 参数中添加 area = "Identity"

最终的 callbackUrl 代码如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多