ASP.NET 核心身份 - 确认电子邮件 return url

ASP.NET Core Identity - Confirm email return url

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

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

这是我迄今为止尝试过的方法:添加>新脚手架项目>身份>Account/ConfirmEmail(要覆盖的文件)现在我有 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:尝试激活 'Project.Areas.Identity.Pages.Account.ConfirmEmailModel'.[=42 时无法解析类型 'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]' 的服务=]

邮件确认后returnurl到/Account/Login在哪里设置?

我也尝试过不使用脚手架和覆盖 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 class,因此不需要帐户确认或电子邮件确认。

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


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

I'm using the default templates, the user is redirected to the Account.RegisterConfirmation

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

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

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

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

it is a simple project I don't want to configure account confirmation

如果不需要账户确认,则无法设置 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<ApplicationUser>(...)使用自定义ApplicationUser配置身份服务class,但是你在[=中注入了一个UserManager实例20=] class using UserManager<IdentityUser>(应该使用UserManager<ApplicationUser>),导致异常。