如何使用参数值为控制器使用自定义AuthorizeAttribute?
-
26-09-2019 - |
题
我正在尝试保护控制器操作,以防止用户访问他们无权访问的实体。我可以使用以下代码来做到这一点。
public ActionResult Entity(string entityCode)
{
if (CurrentUser.VerifyEntityPermission(entityCode))
{
//populate viewModel...
return View(viewModel);
}
return RedirectToAction("NoAccessToEntity", "Error");
}
我希望能够向控制器操作本身添加一个属性。为了验证对实体的访问,我需要查看已传递给控制器的值以及用户有权访问哪些实体。这可能吗?
[EntityAuthRequired]
public ActionResult Entity(string entityCode)
{
//populate viewModel...
return View(viewModel);
}
解决方案
像这样的事情可能会对你有所帮助。尽管您可能希望向属性添加一些附加属性,以允许您在每个操作上指定实体代码参数,而不是对其进行硬编码。
public class EntityAuthRequired : FilterAttribute, IAuthorizationFilter
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//Make sure that this is not NULL before assigning value as string...
var entityCode = filterContext.RouteData.Values["entityCode"] as string;
// do your logic...
if (!allowed)
filterContext.Result = new HttpUnauthorizedResult();
}
}
另外,如果 entityCode
不在您的 RouteData 中,您可以使用 filterContext.RequestContext.HttpContext.Request
查看 POST 数据。
不隶属于 StackOverflow