Аутентификация Windows с помощью групп Active Directory

У меня есть небольшой проект, построенный с использованием Visual Studio 2013,.NET 4.5, MVC 5 и EF 6. Я создал его с помощью проверки подлинности Windows, но теперь мне нужно проверить принадлежность к группе Active Directory, чтобы разрешить или запретить доступ.

Я спустил много ОЧЕНЬ глубоких кроличьих отверстий, пытаясь выяснить, как это сделать. Сначала я предположил, что мне нужно будет изменить проект, чтобы использовать аутентификацию "On-Premises" . Однако я обнаружил, что:

  • В VS 2013, по-видимому, нет способа изменить тип аутентификации, которую использует проект (кроме ручного редактирования некоторых файлов).
  • В документации еще нет объяснений, как настроить аутентификацию "On-Premises" . (Действительно? Как это возможно?)
  • В любом случае мне не нужна аутентификация "On-Premises" , поскольку это только для служб Windows Identity Federation (или что-то в этом роде). Вместо этого я использую только проверку подлинности Windows с ролями ASP.Net, которые, по-видимому, получают Windows из групп Active Directory при входе в систему.

Итак, если предположить, что # 3 истинно, я пробовал читать многочисленные сообщения об этом, но они, похоже, попадают в две основные группы:

  • Простые, простые методы, с которыми я не могу работать, вероятно, потому что он предполагает некоторые знания, которых у меня нет.
  • Сложные, настраиваемые методы, которые, как я подозреваю, делают с помощью кода, что, вероятно, можно сделать в методе без кода.

Предполагая, что # 1 - путь, вот моя последняя попытка.

В моем контроллере у меня есть:

[Authorize([email protected]"SomeDomain\\SomeGroup")]
public class SomeController : Controller

В моем файле Web.config у меня есть:

  <system.web>
    <authentication mode="Windows" />
    <authorization>
      <deny users="?" />
    </authorization>
    <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
      <providers>
        <clear/>
        <add name="AspNetWindowsTokenRoleProvider"
             type="System.Web.Security.WindowsTokenRoleProvider"
             applicationName="/" />
      </providers>
    </roleManager>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="BehaviorConfiguration">
          <serviceAuthorization
               principalPermissionMode="UseAspNetRoles"
               roleProviderName="AspNetWindowsTokenRoleProvider" />
          <serviceMetadata />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Когда я пытаюсь получить доступ к странице, вместо этого мне будет предложено войти. После ввода моего идентификатора входа и пароля я продолжаю получать приглашение для входа. Мне не разрешено попасть на страницу.

У меня нет ничего, где бы говорилось о моем приложении, где находится сервер Active Directory, но впечатление, которое я получаю, это то, что Windows уже знает это (поскольку, когда я вхожу в Windows, он обращается к серверу Active Directory для проверки подлинности меня).

Я что-то упустил? Или я ошибаюсь, полагая, что это можно сделать без написания специального кода?

Предостережение: я довольно новичок в .NET, MVC и т.д., появившись из Java-мира, поэтому, пожалуйста, используйте небольшие слова.: -)

Ответ 1

Я нашел проблему. То, что у меня было выше, было правильным, если бы у меня не было двух обратных косых черт между именем домена и именем роли, а не одним. Исправлено только изменение этого:

[Authorize([email protected]"SomeDomain\SomeGroup")]

Ответ 2

Вы также можете сделать этот фильтр в RegisterGlobalFilters в папке App_Start.

 public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        if (filters == null)
        {
            throw new ArgumentNullException("filters");
        }

        filters.Add(new HandleErrorAttribute());

        var authorizeAttribute = new AuthorizeAttribute
        {
            Roles = "Domain\Group" // Role = group in Active Directory
        };

        filters.Add(authorizeAttribute);
    }
}