Asp.net core 在.net core 1.1中访问操作方法之前,如何设置控制器上的用户属性?

Asp.net core 在.net core 1.1中访问操作方法之前,如何设置控制器上的用户属性?,asp.net-core,asp.net-core-mvc,asp.net-core-identity,Asp.net Core,Asp.net Core Mvc,Asp.net Core Identity,使用.net core 1.1 mvc 目标是限制用户,使他们只能编辑自己,或允许管理员编辑用户。我需要获取当前用户,并将该用户的id与在参数(或cookie)中传递的用户id进行比较 如果用户ID不匹配,请检查当前用户是否为管理员。如果是,则获取作为参数(或cookie)传入的用户id的用户 我们有一个控制器,它通过依赖项注入在构造函数中接收ApplicationDBContext和UserManager 我两次尝试都失败了: 1) 我尝试创建一个ActionFilter,它通过context

使用.net core 1.1 mvc

目标是限制用户,使他们只能编辑自己,或允许管理员编辑用户。我需要获取当前用户,并将该用户的id与在参数(或cookie)中传递的用户id进行比较

如果用户ID不匹配,请检查当前用户是否为管理员。如果是,则获取作为参数(或cookie)传入的用户id的用户

我们有一个控制器,它通过依赖项注入在构造函数中接收ApplicationDBContext和UserManager

我两次尝试都失败了: 1) 我尝试创建一个ActionFilter,它通过context.Controller.UserManager(我从控制器构造函数设置的属性)访问UserManager,但是UserManager有一个IDisposable错误


2) 我尝试从Controller构造函数中执行此操作,但如果找不到用户,并且不知道如何从Action方法之外执行此操作,我需要将响应设置为404。

经过一天的尝试和错误,我找到了答案,并想与大家分享,因为我无法在线找到任何示例

请注意,我必须使用IAsyncationFilter,因为只要我调用筛选器中的异步方法(Controller.UserToEditProp=await UserManager.FindByIdAsync),代码就会在Action方法内部开始执行


经过一天的反复试验,我终于明白了这一点,并想与大家分享,因为我在网上找不到任何例子

请注意,我必须使用IAsyncationFilter,因为只要我调用筛选器中的异步方法(Controller.UserToEditProp=await UserManager.FindByIdAsync),代码就会在Action方法内部开始执行

public class ImpersonateAttribute : ActionFilterAttribute, IAsyncActionFilter
{
    public override async Task OnActionExecutionAsync(
        ActionExecutingContext context,
        ActionExecutionDelegate next)
    {
        string ThisUserID = context.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
        ApiController Controller = (ApiController)context.Controller;
        var UserManager = Controller.UserManager;

        if (context.ActionArguments.ContainsKey("UserID"))
        {
            string RequestedUserID = context.ActionArguments["UserID"].ToString();

            if (ThisUserID != RequestedUserID)
            {
                if (!context.HttpContext.User.IsInRole(UserType.Admin.GetDisplayName()))
                {
                    context.Result = new UnauthorizedResult();
                }
            }

            Controller.UserToEditProp = await UserManager.FindByIdAsync(RequestedUserID);
        }
        else
        {
            Controller.UserToEditProp = await UserManager.FindByIdAsync(ThisUserID);
        }

        await next();

        // do something after the action executes
    }

}