让我们说我们有一个这样的行动方法:
public ActionResult SomeMethod(int a, int b)
为了实现一些细粒度的授权,可以实现一个从ActionFilterAttribute继承并使用以下方法访问上述参数的操作:
filterContext.RouteData.Values
在OnActionExecuting期间。这是好习惯吗?是否有更好的方法来获得这种细粒度的授权?
答案 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,这在请求的后面。