2014-02-11 3 views
11

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

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

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

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

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

Предполагая, что # 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-мира, поэтому, пожалуйста, используйте небольшие слова. :-)

+0

Вы должны проверить этот вопрос. Вероятно, для более ранней версии mvc, но проверка подлинности Windows не изменилась за какое-то время. http://stackoverflow.com/questions/13767439/using-windows-authentication-with-active-directory-groups-as-roles – Shoe

+0

Я уже смотрел этот пост и основывался на большинстве своих попыток, но он не работал. Однако я только что понял, что я сделал не так. В атрибуте моего контроллера у меня было 2 обратных слэша между именем домена и именем роли, а не одним. Так что у меня было: '[Авторизоваться (Roles = @ "\\ SomeDomain SomeGroup")]' вместо '[Авторизоваться (Roles = @ "SomeDomain \ SomeGroup")]' Doh! –

ответ

8

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

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

Пояснительная записка для учащихся .NET: ставя '@' перед любым строковым литералом, означает «взять эту строку точно так же, как написано, не давая символу обратной косой черты любые специальные полномочия в качестве символа выхода для управляющих кодов». Альтернативой является сброс '@' перед строкой, а затем удвоить ваши обратные косые черты, потому что каждый \\ будет интерпретироваться как единственный литерал \. Это позволяет использовать коды управления C-стиля, например. '\ r \ n \ t' и т. д. Хорошо сделано для решения вашей собственной проблемы! –

0

Вы можете также сделать этот фильтр в 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); 
    } 
} 
Смежные вопросы