简体   繁体   English

ApplicationUser在Asp.Net Core 2.0中的ActionFilter中?

[英]ApplicationUser within an ActionFilter in Asp.Net Core 2.0?

How can I access the current ApplicationUser (or UserManager ) within an ActionFilter in Asp.Net Core 2.0? 如何在Asp.Net Core 2.0中的ActionFilter中访问当前的ApplicationUser (或UserManager )?

I am trying to lock down the entire application until the user accepts the EULA (End User License Agreement), changes their password, and fills out required personal information. 我试图锁定整个应用程序,直到用户接受EULA(最终用户许可协议),更改其密码并填写所需的个人信息。

public class ApplicationUser : IdentityUser
{
    ...
    public DateTime? DateEULAAccepted { get; set; }
    ...
}

Here is the ActionFilter code: 这是ActionFilter代码:

public class ProfileRequiredActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            var CurUser = UserManager<ApplicationUser>.GetUserAsync(filterContext.HttpContext.User);
            ...
            if (CurUser.Result.DateEULAAccepted.ToString() == null)
            {
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Account", action = "AgreeToEULA" }));
            }
            ...
        }
    }
}

I am instantiating the ActionFilter in the Startup > ConfigureServices as follows: 我在Startup > ConfigureServices实例化ActionFilter ,如下所示:

...
    services.AddMvc(options =>
    {
        options.Filters.Add(new ProfileRequiredActionFilter());
    });
...

Try adding your filter in ConfigureServices() as follows: 尝试在ConfigureServices()添加过滤器,如下所示:

services.AddMvc(options => { 
    options.Filters.Add<ProfileRequiredActionFilter>(); 
});

You can then inject your UserManager into the filter as follows: 然后,您可以将UserManager注入过滤器,如下所示:

public class ProfileRequiredActionFilter : IActionFilter
{
    private UserManager<ApplicationUser> _userManager;

    public ProfileRequiredActionFilter(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            var CurUser = _userManager<ApplicationUser>.GetUserAsync(filterContext.HttpContext.User);
            ...
            if (CurUser.Result.DateEULAAccepted.ToString() == null)
            {
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Account", action = "AgreeToEULA" }));
            }
            ...
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM