细粒度访问控制的行动方法

时间:2013-02-26 19:11:13

标签: c# asp.net-mvc

让我们说我们有一个这样的行动方法:

public ActionResult SomeMethod(int a, int b)

为了实现一些细粒度的授权,可以实现一个从ActionFilterAttribute继承并使用以下方法访问上述参数的操作:

filterContext.RouteData.Values 
在OnActionExecuting期间

。这是好习惯吗?是否有更好的方法来获得这种细粒度的授权?

2 个答案:

答案 0 :(得分:2)

  

这是好习惯吗?

当然这是一种安全风险。依赖客户端可能发送的参数是危险的。请记住,客户端可以将任何他想要的值作为参数发送给您。无论您是在服务器上实施过滤器,操作,绑定器还是其他任何东西,您的安全性都会受到影响。永远不要依赖客户端发送的参数来实现任何安全性。

但是,如果您要实施某些安全检查,那么这些检查绝对应该在自定义IAuthorizationFilter中完成,而不是在操作过滤器中完成。授权过滤器在执行管道中比动作过滤器早得多。

例如:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        if (!authorized)
        {
            // no authenticated user => no need to go any further
            return false;
        }

        var routeData = httpContext.Request.RequestContext.RouteData;
        // get the username of the currently authentciated user
        string username = httpContext.User.Identity.Name;

        // Get the a parameter
        string a = routeData.Values["a"] as string;

        // Get the b parameter
        string b = routeData.Values["b"] as string;

        return IsAuthorized(username, a, b);
    }

    private bool IsAuthorized(string username, string a, string b)
    {
        // TODO: you know what to do here => hit the database to check
        // whether the user is authorized to work with a and b
        throw new NotImplementedException();
    }
}

答案 1 :(得分:1)

特别是,如果这是安全检查,建议实施IAuthorizationFilter,而不是等待OnActionExecuting,这在请求的后面。