【问题标题】:ASP.NET Core Identity - Confirm email return urlASP.NET Core Identity - 确认电子邮件返回 url
【发布时间】:2020-11-08 22:46:31
【问题描述】:

我已经成功地使用 ASP.NET Core Identity 为我的项目设置了注册和登录。一切正常,但有一件小事真的困扰着我。

由于这是一个简单的项目,我不想通过真正向用户发送电子邮件来配置帐户确认,所以我使用默认模板,用户被重定向到 Account.RegisterConfirmation,他们可以在其中选择一个链接到确认帐户,将用户重定向到 /Identity/Account/ConfirmEmail 这是一个只有标题的空白页面。我不喜欢它。选择链接以确认帐户后,我想将用户重定向到 /Account/Login。但是我在哪里设置呢?

这是我迄今为止尝试过的:添加>新脚手架项目>身份>帐户/确认电子邮件(要覆盖的文件),我现在有 ConfirmEmail.cshtml.cs:

[AllowAnonymous]
    public class ConfirmEmailModel : PageModel
    {
        private readonly UserManager<IdentityUser> _userManager;

        public ConfirmEmailModel(UserManager<IdentityUser> userManager)
        {
            _userManager = userManager;
        }

        [TempData]
        public string StatusMessage { get; set; }

        public async Task<IActionResult> OnGetAsync(string userId, string code)
        {
            if (userId == null || code == null)
            {
                return RedirectToPage("/Index");
            }

            var user = await _userManager.FindByIdAsync(userId);
            if (user == null)
            {
                return NotFound($"Unable to load user with ID '{userId}'.");
            }

            code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code));
            var result = await _userManager.ConfirmEmailAsync(user, code);
            StatusMessage = result.Succeeded ? "Thank you for confirming your email." : "Error confirming your email.";
            return Page();
        }
    }

return Page(); 更改为return RedirectToPage("/Account/Login"); 会导致InvalidOperationException:尝试激活“项目”时无法解析类型“Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]”的服务.Areas.Identity.Pages.Account.ConfirmEmailModel'。

邮件确认后在哪里设置/Account/Login的返回url?

我也尝试过不使用脚手架和覆盖 Account/ConfirmEmail,在 Register.cshtml.cs 中有

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

我尝试将 returnUrl = returnUrl 更改为returnUrl = "~/Account/Login" ,但没有成功。

**** 更新 ***

因为这样一个简单的项目我不需要电子邮件确认,所以我添加了这个

options.SignIn.RequireConfirmedAccount = false

到 Startup 类,因此需要帐户确认或电子邮件确认。

services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = false)
                    .AddEntityFrameworkStores<ProjectContext>();


services.Configure<IdentityOptions>(options =>
{
    options.SignIn.RequireConfirmedEmail = false;
    options.SignIn.RequireConfirmedAccount = false;
});

【问题讨论】:

  • return Page() 是否工作正常;我看到错误消息是针对 DI....
  • 尝试在 URL 中添加波浪号'~',例如 return RedirectToPage("~/Account/Login")
  • @RohitKumar 我只是注意到它对于 return Page() 也不起作用,实际上在 Add>New Scaffolded Item>Identity>Account/ConfirmEmail(file to override) 我得到 InvalidOperationException 即使我这样做不对 ConfirmEmail.cshtml.cs 进行任何更改
  • @JonathanAlfaro 它也不适用于~
  • 错误在于 DI .....执行是否达到直到 var result = await _userManager.ConfirmEmailAsync(user, code);

标签: c# asp.net-core asp.net-core-identity


【解决方案1】:

我正在使用默认模板,用户被重定向到 Account.RegisterConfirmation

在配置身份服务的默认代码中,我们会发现RequireConfirmedAccount 选项设置为true,如下所示。

services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

我们可以发现在RegisterModel类页面处理程序中创建用户帐户后,用户将被重定向到RegisterConfirmation页面。

if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
    return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl });
}
else
{

这是一个简单的项目我不想配置帐户确认

如果您不需要账户确认,您可以不设置 RequireConfirmedAccount property (defaults to false) of SignInOptions 在您配置身份服务时。

services.AddDefaultIdentity<ApplicationUser>()
        .AddEntityFrameworkStores<ProjectContext>();

或者像你一样,明确设置SignIn settings

services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = false)
    .AddEntityFrameworkStores<ProjectContext>();

此外,我们可以发现您在 Startup ConfigureServices 方法中调用 services.AddDefaultIdentity&lt;ApplicationUser&gt;(...) 以使用您自定义的 ApplicationUser 类配置身份服务,但是您使用 UserManager&lt;IdentityUser&gt;ConfirmEmailModel 类中注入了一个 UserManager 实例(应该使用 @ 987654337@),导致异常。

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 2016-12-11
    • 2021-07-25
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2016-03-20
    • 2023-04-04
    • 2016-08-06
    相关资源
    最近更新 更多