假设我们有一个像这样的动作方法:
public ActionResult SomeMethod(int a, int b)
为了实现一些细粒度的授权,可以实现一个从 ActionFilterAttribute 继承并使用以下参数访问上述参数的操作:
filterContext.RouteData.Values
在 OnActionExecuting 期间。这是好习惯吗?这种细粒度的授权有更好的方法吗?
假设我们有一个像这样的动作方法:
public ActionResult SomeMethod(int a, int b)
为了实现一些细粒度的授权,可以实现一个从 ActionFilterAttribute 继承并使用以下参数访问上述参数的操作:
filterContext.RouteData.Values
在 OnActionExecuting 期间。这是好习惯吗?这种细粒度的授权有更好的方法吗?
这是好习惯吗?
当然,这是一个安全风险。依赖客户端可能发送的参数是危险的。请记住,客户端可以向您发送他想要的任何值作为参数。无论您在服务器上实施过滤器、操作、活页夹还是其他任何东西,您的安全都会受到损害。永远不要依赖客户端发送的参数来实现任何安全性。
但是如果你想实现一些安全检查,这些检查绝对应该在 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();
}
}
特别是,如果这是一个安全检查,建议实现一个IAuthorizationFilter
,而不是等待 OnActionExecuting,后者在请求的后面。