Я использую ядро ASP.net 2.0. Я добавил столбец флага с именем IsChangePassword в свою таблицу AspNetUsers и в свой класс ApplicationUser. Идея состоит в том, чтобы заставить пользователя изменить свой пароль. Всегда есть вероятность, что они могут ввести URL-адрес, чтобы обойти необходимость смены пароля. Я хочу, чтобы он проверял это свойство каждый раз, когда загружается веб-страница, и перенаправлял на ChangePassword, если этот флаг установлен.
Принудительно сменить пароль пользователя при загрузке любой веб-страницы
Ответы (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));
});
Я бы использовал промежуточное программное обеспечение, в котором я проверял бы HttpContext для текущего принципала и проверял бы значение свойства IsChangePassword базового пользователя.
Затем, в соответствии со значением свойства IsChangePassword, я бы перенаправил текущий запрос на форму смены пароля.
Преимущество этого решения в том, что вам не нужно редактировать какие-либо действия и контроллеры.
Минус в том, что вы добавляете оператор if к каждому запросу, но возможна дополнительная конфигурация.