使用.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。
答案 0 :(得分:1)
经过一天的反复试验后,我想出来并想分享,因为我在网上找不到任何例子。
请注意,我必须使用IAsyncActionFilter,因为只要在过滤器中调用异步方法,代码就会在Action方法内部开始执行(Controller.UserToEditProp = await UserManager.FindByIdAsync)
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
}
}