MVC中的权限限制是这样写Authorize,好像是要每一个控制器内面的每一个方法都要写啊,有没有统一方法,像webform一样在web.confing配置一下就行昵
它提供[Authorize(Roles="admin")]角色的权限管理,可我们一般开发都不是都角色管理。像webfrom模式中,我们对于每一个页。我们继承权限基类,   
 public override int PermissionID
    {
        get
        {
            return 6;
        }
    }
返回每个页需要的权限值。进行控制。那在MVC中,这如何控制昵? 

解决方案 »

  1.   

    [Authorize(Roles="admin")]
    public class XXXXControler : Controller {
      

  2.   

    怎么可能,前台页不返回权限值,BLL怎可以验证。再说,权限怎么在业务层判断昵。都在权限基类啊,
      

  3.   

    AuthorizeAttribute还有一个Users属性。
      

  4.   

    或者自己实现IAuthorizationFilter写一个过滤器。
      

  5.   

    不要写得太死,我的意思是这样的,用户名和角色名都是可以变的
    但权限值不变。
    就是webform开发一样,每个页都有一个对应的权限值。进行权限验证,只需知道,用户权限集中,有没有这个权限值就可以了。至于用户是什么角色并不重要。角色是为了统一进行分配权限,不用每个用户都要去设置权限。新来的用户,分配己设置好的角色就行了。
    那像MVC可不可这样昵,就是这个控制器中的方法,都指定一个权限值,跟web.form一样昵,或者类似的方法
      

  6.   

    一定要在ui里处理的话,那就是自己实现IAuthorizationFilter接口写一个过滤器,自己定义验证的规则
      

  7.   

    你们在MVC内面怎样定义权限,说说看,也好参考一下
      

  8.   

    对头有验证标签?以前收藏的。MVC权限
      

  9.   

    很简单,类似这样
     /// <summary>
        /// URL授权类
        /// </summary>
        public class UrlAuthorizeAttribute : AuthorizeAttribute
        {
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                if (filterContext == null) throw new ArgumentNullException("filterContext");            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
                {
                    filterContext.Result = new HttpUnauthorizedResult();
                    return;
                }            List<PermissionItem> systemPathTagCollection 
                    = GetSystemPathTag(filterContext, filterContext.HttpContext.Request.Path);            if (!CanAccess(filterContext, systemPathTagCollection)) 
                    ShowError(filterContext, "没有权限访问该页面");
            }
    }
     UrlAuthorize 这个 Attribute 可以+ 在Action 上,也可以+在 Controller 上
      

  10.   

    我也刚学习MVC,直接看的MVC3.。。
    同学习。。
      

  11.   

    嗯,大家都了点答案,我现在很关心的问题,不是身份验证而是权限验证。说说关于权限验证吧比如,验证某个Action操作需要某个权限值。比如25,如果账号从数据库中查询到的权限集中,没有这个权限,就不能操作。
      

  12.   

    是的,首先,非常感谢你的回答,我想,这个答案,可能就是满意答案。
    但先考虑一下,我的MVC项目经验为零。
    目前正在接触MVC,大体上也有所了解,一般性的操作,比如添/更/册/查,都没有啥问题。
    考虑进一步加深,想到权限如何控制,就不太明白。你给出的例子,简明扼要。明白人没事,可我是不明白人啊麻烦你再说一下,谢谢
      

  13.   

    如果这个是用URL地址控制权限。后台代码怎样处理昵。
    建立一个用户表,和一个UER表,一个用户对应多个URL,然后获得URL,查询对应用户的URL集是否有该URL?
    (多人使用可以用角色方案处理)
    那么对于页的安钮权限怎么办啊?
      

  14.   

    用mvc又要用url来控制,这个方式就不合理。
      

  15.   

    不仅 可以 重写 AuthorizeAttribute,还可以是  ActionNameSelectorAttribute ,都有 控制action的权限。
      

  16.   

    ASP.NET MVC 中有个 Filter 的概念一般叫Action Filter,作用在 Action or Action 所在的 Controller 上Filter 的特点是可以在 Action 执行前/后 or Action Result执行前/后 进行操作有四种不同类型的 Filter  你可以自行搜索下。Authorization Filter  就是其中之一,它就可以用来进行权限验证,因为它在Action 执行前进行
      

  17.   

    开始学了学MVC2,现在忘的差不多了。。
      

  18.   

    哈哈,我突然想到一个办法,有没有好的MVC成功(包括权限)网站代码下载啊,弄一个来看,就是明白了???
      

  19.   


    List<PermissionItem> systemPathTagCollection 
                    = GetSystemPathTag(filterContext, filterContext.HttpContext.Request.Path);filterContext.HttpContext.Request.Path 就是要判断URL的
    可以写个自定义的 HtmlHelper 或类似的东西, 将按钮权限传入 然后控制是否生成按钮,或按钮是否可用
      

  20.   

    mvc和webform的权限判断有啥区别
    你的权限针对的是action又不是url
      

  21.   

    感觉有区别,坦方说,在webform中,每个页只要继承权限基类,然后
        public override int PermissionID
        {
            get
            {
                return 22;
            }
        }
    返加该页权限值就可以了,用户登陆成功,打开有该页时,查询该权限是否在用户的权限值集里,就可以判断出,该用户有没有权限。但,像MVC,首次,我都不知道该从那里,为一个Action设定一个权限值。上面版主,提出那个URL,控制,想了想,也可行,那还有没有别的方法昵???
      

  22.   

    不是,我咋天,我问了一MVP,QQ上问,他说,他从来没这样用过,也没有一个项目这样用过,用URL作权限验证,我想问更多,他在比赛,不便多问,他叫我先多谷歌。我想也是,因为我也没用过URL权限验证,当然,这并不代表它是错的,剑走偏锋,也是可以的,达到目的就是行的,好的。我想看看更多的思想,了解更多一点,今天结吧,无论是否有结果。
      

  23.   

    什么叫 URL权限验证 ? 
    权限 不都是 是 通过 角色来判断的吗?
    在Action/Controller 上 加特性 就行了。
      

  24.   

    是不是剑走偏锋不是看个人理解,而是要看实际应用。我在#34告诉你的,确切的说是对Action进行控制,需要通过URL方式而已
      

  25.   

    mvc的过滤器都已经直接加在action或controller上了,相当于webform在page的代码内来控制权限了,这时候再考虑什么url都是多余的...
      

  26.   

        public class PermissionRequiredAttribute : AuthorizeAttribute, IAuthorizationFilter
        {
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                // 这里完成权限验证,不管是什么方法。            if (没有权限)
                {
                    filterContext.Result = new ActionResult(); // 返回一个ActionResult提示没有权限。
                }
            }
        }
      

  27.   

    大家说法都很有道理,可能我的理解,或者表达有点错误,我仔细地再表达一下。public class PermissionRequiredAttribute : AuthorizeAttribute, IAuthorizationFilter
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            // 这里完成权限验证,不管是什么方法。        if (没有权限)
            {
               (A点)
                filterContext.Result = new ActionResult(); 
              // 返回一个ActionResult提示没有权限。
            }
        }
    }
    public class TestFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //这里进行权限验证(B点)
        }
    }验证方式,可以通过以上方式,可以验证,这个我明白清楚。验证如下        [TestFilter]
            public ActionResult About()
            {
                return View();
            }
    我搞不清楚的是,在A点,和B点,进行权限验证,用什么传进权限值,就是操作该Action需要的权限。在
    webform模式中,我们可以通过以下方式,为该页返回该页需要的权限.  public override int PermissionID
      {
        get
        {
         return 22;
        }
      }
    那在MVC中,版主说了一个是这样的,获取请求URLfilterContext.HttpContext.Request.Path 对于版主这个说法,我的理解是:获取请求的RUL,然后,在数据库中查询该用户所有能浏览的URL集合,如果该URL,在其中,他就能访问。(大概意思是这样,如果多人使用,可配置角色,减少重复性配置)对于这种方式,不知的我理解对不对,如果对,我想问的问题就是,除了这样,还有其它的方法。
    如果不错,麻烦大家指点一下。谢谢。
      

  28.   

    public class PermissionRequiredAttribute : FilterAttribute, IAuthorizationFilter
    {
         public int PermissionID { get; set; }     PermissionRequiredAttribute(int permissionID){ this.PermissionID = permissionID; }}[PermissionRequired(12345)]
    public ActionResult About(){  }
      

  29.   

    在webform模式中,我们可以通过以下方式,为该页返回该页需要的权限.public override int PermissionID
      {
        get
        {
         return 22;
        }
      }你这个22 是写死的,还是动态获取的写死的话
    public class TestFilter : ActionFilterAttribute
    {
        public int PermissionID {set;get;}
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //PermissionID 
            //这里进行权限验证(B点)
        }
    }[TestFilter(PermissionID = 22)]
    动态获取的话
    [TestFilter(PermissionStr = "相应Name")]然后根据Name 获取权限ID
      

  30.   

    我的理解是:获取请求的RUL,然后,在数据库中查询该用户所有能浏览的URL集合,如果该URL,在其中,他就能访问。(大概意思是这样,如果多人使用,可配置角色,减少重复性配置)
    --------------------------------------------------------------------------
    恩,是的
      

  31.   


    对,页的权限一定是写死的,不变动的,可以随意写定角色,角色可以随意编定权限,这样给用户分配角色就可以了,角色的权限也可以随时更改。灵活度高。非常感谢大家的回答。我一味地想MVC是个新玩意,忘了类。类有构造函数,属性等等。我老想到MVC是新玩儿把思维固定死。非常渐愧。  最后一句,感谢大家。