2

假设我们有一个像这样的动作方法:

public ActionResult SomeMethod(int a, int b)

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

filterContext.RouteData.Values 

在 OnActionExecuting 期间。这是好习惯吗?这种细粒度的授权有更好的方法吗?

4

2 回答 2

2

这是好习惯吗?

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

但是如果你想实现一些安全检查,这些检查绝对应该在 custom 中完成IAuthorizationFilter,而不是在 action 过滤器中。授权过滤器在执行管道中比操作过滤器运行得更早。

例如:

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();
    }
}
于 2013-02-26T21:30:48.267 回答
1

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

于 2013-02-26T21:28:23.800 回答