如何使用Custom AuthorizeAttribute控制器利用参数值?

RSo*_*erg 6 c# security asp.net-mvc authorize-attribute controller-action

我正在尝试保护控制器操作以防止用户访问他们无权访问的实体.我可以使用以下代码执行此操作.

public ActionResult Entity(string entityCode)
{
    if (CurrentUser.VerifyEntityPermission(entityCode))
    {
        //populate viewModel...
        return View(viewModel);
    }
    return RedirectToAction("NoAccessToEntity", "Error");
}
Run Code Online (Sandbox Code Playgroud)

我希望能够为控制器操作本身添加一个属性.为了验证对实体的访问,我需要查看传递给控制器​​的值以及用户可以访问的实体.这可能吗?

[EntityAuthRequired]
public ActionResult Entity(string entityCode)
{
        //populate viewModel...
        return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)

Jab*_*Jab 3

像这样的事情可能会对你有所帮助。尽管您可能希望向属性添加一些附加属性,以允许您在每个操作上指定实体代码参数,而不是对其进行硬编码。

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();            
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,如果entityCodeRouteData 中没有,您可以用来filterContext.RequestContext.HttpContext.Request查看 POST 数据。