【问题标题】:Authorize current user against controller and action name in ASP.NET MVC 3针对 ASP.NET MVC 3 中的控制器和操作名称授权当前用户
【发布时间】:2011-08-01 11:18:30
【问题描述】:

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

内置的授权不能适应这种设置,所以我尝试创建一个自定义的 AuthorizeAttribute。覆盖 AuthorizeCore 时,我意识到我无权访问控制器名称和操作名称。

我能否以某种方式要求路由器解析 AuthorizeCore 中的 Request.RawUrl 以获取控制器和操作名称?还是有其他方法可以做我想做的事?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 authorization


    【解决方案1】:
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var routeData = httpContext.Request.RequestContext.RouteData;
        var controller = routeData.GetRequiredString("controller");
        var action = routeData.GetRequiredString("action");
        ...
    }
    

    【讨论】:

    • 所以我可以访问控制器和操作名称:)
    【解决方案2】:

    您可以使用 Action Filters 来实现此目的,您可以在其中访问所有 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 中的问题。
    • OnAuthorization 可以在请求和用户之间进行缓存/共享,因此这是不安全的。请改用 AuthorizeCore。
    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2013-05-18
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多