ASP .NET MVC авторизация форм с группами Active Directory - PullRequest
26 голосов
/ 03 декабря 2010

Я пытаюсь пройти проверку подлинности, используя пользователей и группы в 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.

Ответы [ 2 ]

33 голосов
/ 08 декабря 2010

Итак, я реализовал свой собственный атрибут авторизации и использовал его:

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

32 голосов
/ 16 июня 2011

Больше нет необходимости реализовывать свой собственный атрибут для этой функции в 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")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...