【问题标题】:ApplicationUser within an ActionFilter in Asp.Net Core 2.0?Asp.Net Core 2.0 中的 ActionFilter 中的 ApplicationUser?
【发布时间】:2017-12-19 20:18:40
【问题描述】:

如何在 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 &gt; ConfigureServices 中实例化ActionFilter 如下:

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

【问题讨论】:

  • 您是否将UserManager 注入到您的ActionFilter 中?什么不适合你?
  • 我不知道如何将 UserManager 注入...我在 Startup ConfigureServices 中实例化 ActionFilter,如下所示:
  • services.AddMvc(options => { options.Filters.Add(new ProfileRequiredActionFilter()); });

标签: entity-framework asp.net-core-mvc asp.net-core-2.0


【解决方案1】:

尝试在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" }));
            }
            ...
        }
    }
}

【讨论】:

  • 完美答案:)
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 2020-08-16
  • 1970-01-01
  • 2018-06-20
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多