【发布时间】: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