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

问题描述 投票:0回答:4

在 Windows 域 Intranet 站点上工作时(带有

<authentication mode="Windows" />
),我遇到了以下问题:

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

由于 Active Directory 组名称中存在空格,因此任何用户都无法使用该控制器。那么我可以让 MVC(或 ASP.Net)正确授权,同时使用带有空格的角色名称(此处:AD 组的名称)吗?

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

  1. AD 组,具有用于角色授权的空间
  2. 如果角色包含空格,如何编写AuthorizeAttribute
c# asp.net asp.net-mvc-3 authorization
4个回答
6
投票

创建您自己的属性并从 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()
{
}

3
投票

您可以尝试在您的名字前面添加“MyDomain\”。

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

记得添加@或加倍斜杠“\”。


3
投票

当我尝试以下操作时,包含空格字符的角色工作正常:

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
}

0
投票

我已经成功地能够对包含空格的组名称使用 [Authorize] 属性,并且我自己的测试表明 [Authorize(Roles = "group name"] 属性内的组名称中确实允许使用空格。

如果您的声明源自 Active Directory,并且您的代码尝试根据特定 Active Directory 组中的组成员身份授权请求,并且如果请求被拒绝,则您在中指定的组/角色名称可能会被拒绝。事实与请求身份中包含的声明值不匹配,该请求将被阻止。

一个可能的解决方案:

  1. 使用 Active Directory 用户和计算机找到您想要授权的 Active Directory 组。
  2. 右键单击组名称并选择属性。
  3. 单击“常规”选项卡。
  4. 找到字段“组名称(Windows 2000 之前的版本):”
  5. 检查此字段中的组名称,并将其与您在代码的 [Authorize] 属性中使用的名称进行比较。

您的 Active Directory 组名称可能与 Windows 2000 之前的组名称不同。

总长:

就我而言,我发现我打算针对 AD 组名称进行授权,但 [Authorize] 进程正在针对 Windows 2000 之前的组名称进行授权,这导致授权失败; AD 组名称与 Windows 2000 之前的组名称相同。

如果不创建一个视图来显示每个声明名称和关联的声明值,我可能无法找到此解决方案。事实上,很明显,请求身份中包含的声明值不是我所期望的,这让我回到了 Active Directory。

如何安装 ADUC:Active Directory 用户和计算机

© www.soinside.com 2019 - 2024. All rights reserved.