authentication - 加载任何网页时强制用户更改密码
问题描述
我正在使用 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));
});
推荐阅读
- pandas - 如何在python中的某个字符串处剪切字符串?
- python-3.x - 阈值红外图像
- react-native - 错误:捆绑失败:不变违规:无效资产解析
- python-2.7 - 如何使用连接字符串获取请求的方法?
- kotlin - 使用“when in”证明了地图访问的智能转换
- vue.js - 如何在外部 oauth2 完成后重新获取 apollo vuejs
- spring-cloud-stream - Spring Cloud Stream Kinesis Binder 错误处理
- r - 如何按列和行对值求和,如 Excel 中的数据透视表?
- java - 飞碟无法识别 html 实体
- python - Django request.data.get('submit') 始终没有返回,即使 name 提供为 name="submit"