在将动作加载到asp.net核心之前检查一些条件

问题描述

这是我的行动

  [HttpGet]
        [Authorize(Roles = "AccountExecutive")]
        public async Task<IActionResult> Index()
        {
            var me = await _userManager.GetUserAsync(HttpContext.User);
            var companyContactsviewmodel = new Contactsviewmodel(me);

            return View(companyContactsviewmodel);
        }

现在我想完全更新其密码强制,然后用户可以访问索引页面

现在尝试

 public class ProfilerequiredActionFilter : ActionFilterattribute
    {
            

        public override void OnActionExecuted(ActionExecutedContext context)
        {
            base.OnActionExecuted(context);
        }

        
    }

Startup.cs

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

但是在过滤器中,我无法使用Usermanager,因此无法获取Currnet用户详细信息

我也想在Razor页面视图中做同样的事情

解决方法

如果要在ActionFilter中使用UserManager,可以将UserManager注入其中:

public class ProfileRequiredActionFilter : ActionFilterAttribute
    {
        private UserManager<IdentityUser> _userManager;    
        public ProfileRequiredActionFilter(UserManager<IdentityUser> userManager)
        {
            _userManager = userManager;
        }
        public override void OnActionExecuted(ActionExecutedContext context)
        {
            base.OnActionExecuted(context);
        }

        
    }

在剃须刀页面中没有动作过滤器。您可以使用IAsyncPageFilter并判断其中的处理程序方法的名称:

using Microsoft.Extensions.DependencyInjection;
public class CustomPageFilter : IAsyncPageFilter
    {
       
        public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context,PageHandlerExecutionDelegate next)
        {
           
            if (context.HandlerMethod?.Name == "Update")
            {
                // Running inside a handler method named "Update".
                var svc = context.HttpContext.RequestServices;
                var usermanager = svc.GetService<UserManager<IdentityUser>>();
            }
        }



        Task IAsyncPageFilter.OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
        {
            return Task.CompletedTask;
        }
    }

startup.cs:

services.AddRazorPages().AddMvcOptions(options =>
            {
                options.Filters.Add(new CustomPageFilter());
            });