如果角色名称包含空格,则无法使AuthorizeAttribute有效

时间:2012-10-25 06:40:58

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

在Windows域内网站点(<authentication mode="Windows" />)上工作时,我遇到了以下问题:

[Authorize(Roles = "Domain Users, Domain Admins")]
public class MyController: Controller {...}

由于活动目录组名称中的空格,此控制器不可供任何用户使用。那么我可以正确地使MVC(或ASP.Net)授权,同时使用带空格的角色名称(这里:AD组的名称)吗?

只是类似的问题没有回应:

  1. AD Groups with spaces used for roles authorization
  2. How to write AuthorizeAttribute if a role contains space

3 个答案:

答案 0 :(得分:5)

创建您自己的属性并从AuthorizeAttribute派生。然后重写AuthorizeCore方法并实现自己的逻辑,并对包含空格的角色进行验证。

一个例子可能是这样的:

public class CustomAuthAttribute : AuthorizeAttribute
{
   private readonly IUserRoleService _userRoleService;
   private string[] _allowedRoles;

   public CustomAuthAttribute(params string[] roles)
   {
      _userRoleService = new UserRoleService();
      _allowedRoles = roles;
   }
   protected override bool AuthorizeCore(HttpContextBase httpContext)
   {
    //something like this.
    var userName = httpContext.User.Identity.Name;
    var userRoles = _userRoleService .GetUserRoles(userName); // return list of strings
    return _allowedRoles.Any(x => userRoles.Contains(x));
   }

}

<强>用法

[CustomAuth("role withspace","admin")]
public ActionResult Index()
{
}

答案 1 :(得分:2)

您可以尝试添加&#34; MyDomain \&#34;在你的名字前面。

[Authorize(Roles = @"mydomain\Domain Users, mydomain\Domain Admins")]

请记住添加@或加倍斜杠&#34; \&#34;。

答案 2 :(得分:1)

当我这样做时,空间的作用很好:

public static class AppRoles
{
    public const string Manager     =@"domain\App Manager";
    public const string Admin       =@"domain\App Admin";
}

[Authorize(Roles = AppRoles.Admin)] 
public class MyAbcController : Controller
{
    //code
}