Принудительно сменить пароль пользователя при загрузке любой веб-страницы

Я использую ядро ​​​​ASP.net 2.0. Я добавил столбец флага с именем IsChangePassword в свою таблицу AspNetUsers и в свой класс ApplicationUser. Идея состоит в том, чтобы заставить пользователя изменить свой пароль. Всегда есть вероятность, что они могут ввести URL-адрес, чтобы обойти необходимость смены пароля. Я хочу, чтобы он проверял это свойство каждый раз, когда загружается веб-страница, и перенаправлял на ChangePassword, если этот флаг установлен.


person user369484    schedule 19.08.2019    source источник


Ответы (2)


Вам нужен фильтр ресурсов, в который нужно ввести как UserManager<TUser>, так и IUrlHelperFactory. Первый, очевидно, будет использоваться для проверки значения IsChangePassword, а второй будет необходим для проверки текущего URL-адреса по выбранному вами URL-адресу перенаправления, чтобы предотвратить бесконечный цикл перенаправления. Просто:

public class ChangePasswordResourceFilter : IAsyncResourceFilter
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly IUrlHelperFactory _urlHelperFactory;

    public ChangePasswordResourceFilter(UserManager<ApplicationUser> userManager, IUrlHelperFactory urlHelperFactory)
    {
        _userManager = userManager;
        _urlHelperFactory = urlHelperFactory;
    }

    public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
    {
        var urlHelper = _urlHelperFactory.GetUrlHelper(context);
        var redirectUrl = urlHelper.Page("~/PasswordChange");
        var currentUrl = context.HttpContext.Request.Path;

        if (redirectUrl != currentUrl)
        {
            var user = await _userManager.GetUserAsync(context.HttpContext.User);
            if (user?.IsChangePassword ?? false)
            {
                context.Result = new RedirectResult(redirectUrl);
            }
        }

        await next();
    }
}

Затем в Startup.ConfigureServices:

services.AddScoped<ChangePasswordResourceFilter>();

...

services.AddMvc(o =>
{
    o.Filters.Add(typeof(ChangePasswordResourceFilter));
});
person Chris Pratt    schedule 19.08.2019

Я бы использовал промежуточное программное обеспечение, в котором я проверял бы HttpContext для текущего принципала и проверял бы значение свойства IsChangePassword базового пользователя.

Затем, в соответствии со значением свойства IsChangePassword, я бы перенаправил текущий запрос на форму смены пароля.

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

Минус в том, что вы добавляете оператор if к каждому запросу, но возможна дополнительная конфигурация.

person Alexandre Nourissier    schedule 19.08.2019