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



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

你需要一个资源过滤器,你需要用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语句,但可以进行其他配置。

最新更新