Вам нужно разделить понятия на две:
АУТЕНТИФИКАЦИЯ - это процесс определения того, кто вам звонит, и проверки того, кем он действительно является; это можно сделать с помощью имени пользователя / пароля, учетных данных Windows (он уже аутентифицировался в своем окне Windows через вход в систему) или путем запроса вызывающей стороны некоторой информации (сертификата)
АВТОРИЗАЦИЯ - это процесс - как только вы узнаете , кто вам звонит, определить, что может сделать (или не может) тот, кто звонит вам *
Чтобы использовать группы Active Directory, вам нужно использовать режим безопасности в WCF, который поддерживает учетные данные Windows. Проще всего использовать учетные данные Windows с самого начала, что является значением по умолчанию для wsHttpBinding и netTcpBinding - в этом случае вызывающий всегда будет передавать свои учетные данные Windows при каждом вызове, и вы можете проверить их на стороне сервера, посмотрев на ServiceSecurityContext.Current.WindowsIdentity
WindowsIdentity caller = ServiceSecurityContext.Current.WindowsIdentity;
Это хорошо работает в сценарии интрасети - все находятся за корпоративным брандмауэром и в любом случае проходят проверку подлинности на своих компьютерах. Чтобы включить это, просто используйте привязку wsHttp или netTcp (в этом случае я бы порекомендовал netTcp).
Другой немного более сложный случай - когда ваш клиент представляет сертификат X.509, а затем сопоставляет его на стороне сервера с существующим пользователем AD в вашей сети. Это довольно продвинутое, однако.
Как только ваш абонент аутентифицирован, например, Вы знаете, кто звонит, вы можете использовать обычную модель безопасности на основе ролей, чтобы ограничить привилегии. Просто добавьте атрибуты [PrincipalPermission(....)]
в ваши методы, которые вы хотите защитить, и если пользователь не соответствует ни одному из этих требований, будет выдано исключение безопасности, и метод не будет выполнен.
[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
[PrincipalPermission(SecurityAction.Demand, Name = "JohnDoe")]
public string SayHello(string caller)
{
......
}
Вы можете иметь несколько таких атрибутов «PrincipalPermission», и они сопоставляются друг с другом в стиле «ИЛИ» - если любой из них соответствует текущему вызывающему, ему будет разрешено сделать вызов.
Посетите страницу 4 этой статьи Основы безопасности WCF для получения более подробной информации об использовании безопасности на основе ролей.
Марк