在Asp.Net Core 2.0中,如何在ActionFilter中使用ApplicationUser?

3

如何在Asp.Net Core 2.0的ActionFilter中访问当前ApplicationUser(或UserManager)?

我正在尝试锁定整个应用程序,直到用户接受EULA(最终用户许可协议),更改其密码并填写必需的个人信息。

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

下面是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" }));
            }
            ...
        }
    }
}

我正在Startup > ConfigureServices中实例化ActionFilter,如下所示:

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

你是否将 UserManager 注入到了你的 ActionFilter 中?有什么问题出现了吗? - SpruceMoose
我不知道如何在...中注入UserManager。我正在像这样在Startup ConfigureServices中实例化ActionFilter: - Film8kr
services.AddMvc(options => { options.Filters.Add(new ProfileRequiredActionFilter()); }); 服务.添加Mvc(选项 => { 选项.Filters.Add(new ProfileRequiredActionFilter()); }); - Film8kr
1个回答

9

尝试按以下方式在ConfigureServices()中添加您的过滤器:

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

然后,您可以按照以下方式将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" }));
            }
            ...
        }
    }
}

完美的答案 :) - El7or

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接