Подтвердить что ты не робот

Разрешение ASP.NET MVC Forms с группами Active Directory

Я пытаюсь выполнить аутентификацию с использованием пользователей и групп в ASP.NET MVC для Active Directory.

Я применил следующий атрибут для всех моих классов (кроме класса учетной записи):

[Authorize (Roles="SubcontractDB Users")]

Эта группа находится в OU = Area- > OU = Groups- > OU = Company- > CN = SubcontractDB в активном каталоге. Я предполагаю, что мне также нужно настроить RoleManager в web.config, который я попытался сделать следующим образом:

<roleManager defaultProvider="ADRoleProvider">
  <providers>
    <clear />
        <add name="ADMembershipProvider" 
             type="System.Web.Security.ActiveDirectoryMembershipProvider" 
             connectionStringName="ADConnectionString" 
             attributeMapUsername="sAMAccountName" />
  </providers>
</roleManager>

Моя строка подключения:

    <add name="ADConnectionString" 
         connectionString="LDAP://blah.com:389/DC=blah,DC=wateva,DC=com"/>

Очевидно, я делаю это неправильно, так как это не работает. Все, что я хочу сделать, это разрешить доступ к пользователям, которые являются членами определенной группы в AD.

4b9b3361

Ответ 1

Итак, я закончил реализацию своего собственного атрибута authorize и с помощью этого:

namespace Application.Filters
{  
   public class AuthorizeADAttribute : AuthorizeAttribute
   {
      public string Groups { get; set; }

      protected override bool AuthorizeCore(HttpContextBase httpContext)
      {
         if (base.AuthorizeCore(httpContext))
         {
            /* Return true immediately if the authorization is not 
            locked down to any particular AD group */
            if (String.IsNullOrEmpty(Groups))
               return true;

            // Get the AD groups
            var groups = Groups.Split(',').ToList<string>();

            // Verify that the user is in the given AD group (if any)
            var context = new PrincipalContext(ContextType.Domain, "server");
            var userPrincipal = UserPrincipal.FindByIdentity(context, 
                                                 IdentityType.SamAccountName,
                                                 httpContext.User.Identity.Name);

            foreach (var group in groups)
               if (userPrincipal.IsMemberOf(context, IdentityType.Name, group))
                  return true;
         }
         return false;
      }
   }
}

И тогда я могу просто использовать следующие контроллеры или функции:

Using Application.Filters;
...
[AuthorizeAD(Groups = "groupname")]

NB:. Вы можете просто использовать new PrincipalContext(ContextType.Domain);, но есть ошибка в .NET 4.0, которая вызывает ошибку (0x80005000) в userPrincpal.IsMemberOf(...). Подробнее см. здесь.

Если вы хотите узнать, как перенаправить на другую страницу на основе неудачной авторизации, проверьте мой ответ здесь: Добавление сообщения об ошибке в модель представления на основе атрибута контроллера в ASP.NET MVC

Ответ 2

Вам больше не нужно реализовывать свой собственный атрибут для этой функции в ASP.NET MVC 3. AspNetWindowsTokenRoleProvider работает с пользователями и группами Active Directory. Чтобы использовать это с помощью AuthorizeAttribute, вам нужно добавить следующее к вашему web.config:

<authentication mode="Windows" />

<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
   <providers>
      <clear />
      <add 
          name="AspNetWindowsTokenRoleProvider"
          type="System.Web.Security.WindowsTokenRoleProvider" 
          applicationName="/" />
   </providers>
</roleManager>

Затем на ваших контроллерах или методах действий вы можете обратиться к группам Active Directory следующим образом:

[Authorize(Roles = "YOURDOMAIN\\Group1, YOURDOMAIN\\Group2")]