授权过滤器允许您指定可以访问控制器或操作的指定用户组:
[Authorize(Roles="Administrator")]
public class HomeController : Controller
{
// code
}
我想知道是否可以指定无法访问控制器或操作的一组用户。
答案 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;
}
}
用法