Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication 加载任何网页时强制用户更改密码_Authentication_Asp.net Core_Url Routing_Change Password - Fatal编程技术网

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

Authentication 加载任何网页时强制用户更改密码,authentication,asp.net-core,url-routing,change-password,Authentication,Asp.net Core,Url Routing,Change Password,我正在使用ASP.NETCore2.0。我在AspNetUsers表和ApplicationUser类中添加了一个名为IsChangePassword的标志列。其想法是强制用户更改密码。他们总是有可能输入url以避免被迫更改密码。我想让它在每次加载网页时检查属性,如果该标志为真,则重定向到ChangePassword。我将使用中间件,在该中间件中,我将检查HttpContext中的当前主体,并检查底层用户的IsChangePassword属性值 然后,根据IsChangePassword属性值,

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

我将使用中间件,在该中间件中,我将检查HttpContext中的当前主体,并检查底层用户的IsChangePassword属性值

然后,根据IsChangePassword属性值,将当前请求重定向到changepassword表单

此解决方案的优点是不需要编辑任何动作和控制器


缺点是您可以为每个请求添加一个if语句,但可以进行额外的配置。

您需要一个资源筛选器,您需要将它与
UserManager
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();
    }
}
services.AddScoped<ChangePasswordResourceFilter>();

...

services.AddMvc(o =>
{
    o.Filters.Add(typeof(ChangePasswordResourceFilter));
});