首页 > 解决方案 > 加载任何网页时强制用户更改密码

问题描述

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

标签: authenticationasp.net-coreurl-routingchange-password

解决方案


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

推荐阅读