Я бы предложил создать фильтр ресурсов, чтобы проверить, подтверждена ли электронная почта пользователя и если нет, перенаправить в представление для обработки этого:
public class EmailConfirmedResourceFilter : IAsyncResourceFilter
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly IUrlHelperFactory _urlHelperFactory;
public EmailConfirmedResourceFilter(UserManager<ApplicationUser> userManager, IUrlHelperFactory urlHelperFactory)
{
_userManager = userManager ?? throw new ArgumentNullException(nameof(userManager));
_urlHelperFactory = urlHelperFactory ?? throw new ArgumentNullException(nameof(urlHelperFactory));
}
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
var urlHelper = _urlHelperFactory.GetUrlHelper(context);
var ignoreUrls = new[]
{
urlHelper.RouteUrl("ConfirmEmail"),
urlHelper.RouteUrl("ChangeEmail")
};
if (!ignoreUrls.Contains(context.HttpContext.Request.Path.ToString())
&& context.HttpContext.User.Identity.IsAuthenticated)
{
var user = await _userManager.GetUserAsync(context.HttpContext.User);
if (user != null && !await _userManager.IsEmailConfirmedAsync(user))
{
context.Result = new RedirectToRouteResult("ConfirmEmail");
}
}
await next();
}
}
Затем в Startup.cs
:
services.AddMvc(o => {
o.Filters.Add<EmailConfirmedResourceFilter>();
});
services.AddScoped<EmailConfirmedResourceFilter>();
Это похоже на большой код, но это довольно просто.Во-первых, фильтр вызывает несколько URL-адресов, которые следует игнорировать.Если мы находимся на одной из этих страниц, мы не хотим перенаправлять снова, тем более что это потенциально может привести к бесконечному циклу перенаправления.Мы также проверяем, аутентифицирован ли пользователь, потому что это спорный вопрос, если он даже не вошел в систему.
Предполагая, что эти тесты пройдены, мы извлекаем пользователя и проверяем, является ли его электронная почтаподтверждено.Если нет, мы перенаправляем на место, где они могут это сделать.В противном случае все падает до строки await next();
, которая просто передает управление следующей вещи в конвейере (т. Е. Мы ничего не делаем и позволяем обработке запросов двигаться дальше).
Это приведет к форсированиюПользователь на страницу подтверждения по электронной почте в любое время, когда они пытаются перейти в другое место, если они еще не подтверждены.На указанной странице вы можете предоставить возможность изменить адрес электронной почты (который сам по себе потребует подтверждения) или отправить электронное письмо, чтобы просто подтвердить существующий адрес электронной почты.Как только пользователь подтвердит тот или иной способ, он пропустит эту проверку и сможет перейти туда, куда он захочет зайти на сайт.