Ядро asp.net существующие пользователи подтверждают электронную почту, или позволяют изменить адрес электронной почты - PullRequest
0 голосов
/ 18 сентября 2018

Мне просто интересно, как справиться со следующей ситуацией.

В настоящее время у меня есть приложение asp.net mvc, которое я конвертирую в ядро ​​asp.net.В старом приложении asp.net mvc у нас никогда не было подтверждений по электронной почте.Я намерен заставить всех существующих и новых пользователей подтверждать электронную почту в новой базовой версии asp.net.Я полагаю, что могу сделать это через контроллер входа в систему.

Проблема
Проблема, с которой я сталкиваюсь, заключается в том, что если у людей были поддельные адреса электронной почты или они использовали чужой адрес, то они никогда не смогут подтвердить, чтоэлектронная почта.

Предлагаемое решение
Итак, я подумал о том, как это сделать, когда пользователь входит в систему, я даю ему возможность изменить свою электронную почту и отправить подтверждение этомуновый адрес электронной почты?

Желательно ли это?Какие есть хорошие альтернативы этой проблеме?

1 Ответ

0 голосов
/ 18 сентября 2018

Я бы предложил создать фильтр ресурсов, чтобы проверить, подтверждена ли электронная почта пользователя и если нет, перенаправить в представление для обработки этого:

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();, которая просто передает управление следующей вещи в конвейере (т. Е. Мы ничего не делаем и позволяем обработке запросов двигаться дальше).

Это приведет к форсированиюПользователь на страницу подтверждения по электронной почте в любое время, когда они пытаются перейти в другое место, если они еще не подтверждены.На указанной странице вы можете предоставить возможность изменить адрес электронной почты (который сам по себе потребует подтверждения) или отправить электронное письмо, чтобы просто подтвердить существующий адрес электронной почты.Как только пользователь подтвердит тот или иной способ, он пропустит эту проверку и сможет перейти туда, куда он захочет зайти на сайт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...