Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 根据ASP.NET MVC 3中的控制器和操作名称授权当前用户_Asp.net Mvc_Asp.net Mvc 3_Authorization - Fatal编程技术网

Asp.net mvc 根据ASP.NET MVC 3中的控制器和操作名称授权当前用户

Asp.net mvc 根据ASP.NET MVC 3中的控制器和操作名称授权当前用户,asp.net-mvc,asp.net-mvc-3,authorization,Asp.net Mvc,Asp.net Mvc 3,Authorization,我需要在ASP.NET MVC 3中创建自定义授权。在应用程序内部,授权在5个表中定义:用户、组、用户组、权限、组权限。一个用户可以属于多个组,并且每个权限也可以分配给多个组。每个控制器操作都分配了一个RightID 内置授权无法适应此设置,因此我尝试创建一个自定义的authorized属性。当重写AuthorizeCore时,我意识到我无权访问控制器名称和操作名称 我是否可以要求路由器解析AuthorizeCore中的Request.RawUrl以获取控制器和操作名称?或者是否有其他方法来实现

我需要在ASP.NET MVC 3中创建自定义授权。在应用程序内部,授权在5个表中定义:用户、组、用户组、权限、组权限。一个用户可以属于多个组,并且每个权限也可以分配给多个组。每个控制器操作都分配了一个RightID

内置授权无法适应此设置,因此我尝试创建一个自定义的authorized属性。当重写AuthorizeCore时,我意识到我无权访问控制器名称和操作名称


我是否可以要求路由器解析AuthorizeCore中的Request.RawUrl以获取控制器和操作名称?或者是否有其他方法来实现我的要求?

您可以使用操作过滤器来实现这一点,您可以访问所有HttpContex

public class MyAuthorizeAttribute : ActionFilterAttribute, IAuthorizationFilter
{

    #region Implementation of IAuthorizationFilter

    public void OnAuthorization(AuthorizationContext filterContext)
    {
              // ... implementation

              // filterContext.Controller is the controller
              // filterContext.RouteData is all the route data

我在某个地方读到,由于输出缓存存在一些问题,我不应该实现自己的授权过滤器。不确定这在MVC 3.0中是否仍然是一个问题。授权可以在请求和用户之间缓存/共享,因此这是不安全的。改为使用AuthorizeCore。这样我就可以访问控制器和操作名称:)
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    var routeData = httpContext.Request.RequestContext.RouteData;
    var controller = routeData.GetRequiredString("controller");
    var action = routeData.GetRequiredString("action");
    ...
}