【问题标题】:deny custom role拒绝自定义角色
【发布时间】:2011-02-10 13:43:07
【问题描述】:

我怎样才能拒绝访问调用方法。像这样的

    [HandleError]
    [Authorize(Roles = "role1, role2")]
    public class AdminController : Controller
    {          


        [Deny(Roles = "role2")]
        public ActionResult ResultPage(string message)
        {
            ViewData["message"] = message;
            return View();
        }
}

【问题讨论】:

    标签: asp.net-mvc authorization roles membership-provider


    【解决方案1】:

    您可以简单地以相反的方式执行此操作,并检查角色 1 的存在而不是角色 2 的缺失。或者,您可以开发自己的 DenyAttribute 来执行您想要的操作并验证用户不在指定的角色中。

    [HandleError]
    [Authorize(Roles = "role1, role2")]
    public class AdminController : Controller
    {          
    
    
        [Authorize(Roles = "role1")]
        public ActionResult ResultPage(string message)
        {
            ViewData["message"] = message;
            return View();
        }
    }
    
    public class DenyAttribute : AuthorizeAttribute
    {
    
        protected override bool AuthorizeCore(HttpContextBase httpContext) {
            if (httpContext == null) {
                throw new ArgumentNullException("httpContext");
            }
    
            IPrincipal user = httpContext.User;
            if (!user.Identity.IsAuthenticated) {
                return false;
            }
    
            if (Users.Length > 0 && Users.Split(',').Any( u => string.Compare( u.Trim(), user.Identity.Name, StringComparer.OrdinalIgnoreCase))) {
                return false;
            }
    
            if (Roles.Length > 0 && Roles.Split(',').Any( u => user.IsInRole(u.Trim()))) {
                return false;
            }
    
            return true;
        }
    
    }
    

    【讨论】:

    • 我真的希望他们将 _usersSplit 和 _rolesSplit 变量设置为受保护而不是私有。您可以重复使用它们,而不是重新实现拆分。
    猜你喜欢
    • 2019-06-29
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多