ASP.NET MVC:[授权]的对面

时间:2009-09-04 00:01:54

标签: asp.net-mvc authorization

授权过滤器允许您指定可以访问控制器或操作的指定用户组:

[Authorize(Roles="Administrator")]
public class HomeController : Controller
{
    // code
}

我想知道是否可以指定无法访问控制器或操作的一组用户。

4 个答案:

答案 0 :(得分:5)

我尝试在teks建议之后创建自己的授权属性:

public class Restrict : AuthorizeAttribute
{
    private readonly string _role;

    public Restrict(string role)
    {
        _role = role;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException("httpContext");

        if (httpContext.User.IsInRole(_role))
            return false;

        return true;
    }
}

我这样使用它:

[Restrict("Administrator")]
public class HomeController : Controller
{
    // code
}

我不确定这是否是正确的做法,但它确实起到了作用。

答案 1 :(得分:1)

您应该准备自己的ActionFilter,它可以实现这样的功能。 默认情况下,有一个拒绝所有内容的规则,但允许由授权操作过滤器定义(如您所知)。

可以找到一些灵感there

答案 2 :(得分:1)

基于ajbeaven's answer,我设法将其扩展到角色列表而不是一个角色。

首先是Restrict类:

public class Restrict : AuthorizeAttribute {
    private List<string> _roles;
    public string Roles {
        get {
            string roles = "";
            if (_roles != null && _roles.Count > 0) {
                int counter = 0;
                foreach (string role in _roles) {
                    counter++;
                    if (counter == _roles.Count) {
                        roles = role;
                    } else {
                        roles += role + ",";
                    }
                }
            }
            return roles;
        }
        set {
            _roles = new List<string>();
            string[] roles = value.Split(',');
            foreach (string role in roles) {
                _roles.Add(role);
            }
        }
    }

    public Restrict() {
        _roles = new List<string>();
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext) {
        bool result = true;
        if (httpContext == null) {
            throw new ArgumentNullException("httpContext");
        }
        foreach (string role in _roles) {
            if (httpContext.User.IsInRole(role)) {
                result = false;
                break;
            }
        }
        return result;
    }
}

然后添加AppRoles类以使整个解决方案可重用:

public static class AppRoles {
    public const string Role1 = "Role1";
    public const string Role2 = "Role2";
}

用法:

[Authorize]
[Restrict(Roles = AppRoles.Role1 + "," + AppRoles.Role2)]
    public ActionResult Index() {
    return View();
}

答案 3 :(得分:0)

只限制班级:

public class Restrict : AuthorizeAttribute
    {
        public string RestrictedRoles;

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {          
            if (!String.IsNullOrEmpty(RestrictedRoles))
            {
                var roles = RestrictedRoles.Split(',').Select(r => r.Trim());
                foreach (var role in roles)
                {
                    if (httpContext.User.IsInRole(role))
                        return false;
                }
            }

            return true;
        }
    }

用法