加载任何网页时强制用户更改密码

Force user change password when loading any webpage

我正在使用 ASP.net 核心 2.0。我向我的 AspNetUsers table 和我的 ApplicationUser class 添加了一个名为 IsChangePassword 的标志列。这个想法是强制用户更改他们的密码。他们总是有可能输入 url 来绕过被迫更改密码。我想让它在每次加载网页时检查 属性,如果该标志为真,则重定向到 ChangePassword。

我会使用一个中间件,我会在其中检查当前主体的 HttpContext 并检查基础用户的 IsChangePassword 属性 值。

然后,根据 IsChangePassword 属性 值,我会将当前请求重定向到更改密码表单。

此解决方案的优点是您无需编辑任何操作和控制器。

缺点是您向每个请求添加一个 if 语句,但可以进行其他配置。

您需要一个资源过滤器,您需要用 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));
});