| Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
| Все форумы / WCF, Web Services, Remoting |
![]() |
||
|
Lexxxxx Member Откуда: Сообщений: 858 |
Пытаюсь ограничить доступ к службе с привязкой NetTcpBinding(SecurityMode.Transport) и TcpClientCredentialType.Windows определенной группой пользователей Windows. В найденных примерах в интернете все почему-то пользуются переопределением ServiceAutorizationManager или развешивают атрибут PrincipalPermission. Но ведь вроде как правильно будет определять на этапе аутентификации, а не авторизации, разрешено ли пользователю подключаться к сервису? Собственно с реализацией каркаса пользовательского ServiceAuthenticationManager и его подключением проблем нет. Но вот что делать в ServiceAuthenticationManager.Authenticate() чтобы определить кто именно ломится и как узнать принадлежит ли он к нужной нам группе? Никто не пытался реализовывать свой ServiceAuthenticationManager? |
| 19 окт 10, 15:38 [9634912] Ответить | Цитировать Сообщить модератору | |
|
Lexxxxx Member Откуда: Сообщений: 858 |
Пока нашел такой выход из ситуации:
MyServiceHost.Authentication.ServiceAuthenticationManager = new MyAuthenticationManager();
class MyAuthenticationManager: ServiceAuthenticationManager
{
public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message)
{
WindowsPrincipal winPrincipal = new WindowsPrincipal(message.Properties.Security.ServiceSecurityContext.WindowsIdentity);
if (winPrincipal.IsInRole(WindowsBuiltInRole.Administrator))//Собственно сама проверка
{
return base.Authenticate(authPolicy, listenUri, ref message);
}
else
{
return null;
}
}
} |
| 20 окт 10, 11:58 [9639613] Ответить | Цитировать Сообщить модератору | |
|
Lexxxxx Member Откуда: Сообщений: 858 |
Однако кривое решение. В журнале сообщений имеем: InvalidOperationException: Метод проверки подлинности в ServiceAuthenticationManager вернул значение NULL. Если в коллекции не нужен возврат политик авторизации, необходимо вернуть пустой объект ReadOnlyCollection. А если выполнить рекомендации, то аутентификация проходит без проблем. Так как по нормальному ограничить доступ к сервису на этапе аутентификации? |
| 20 окт 10, 14:02 [9640784] Ответить | Цитировать Сообщить модератору | |
|
heeepi Member Откуда: Сообщений: 14 |
ServiceAuthenticationManager необходим для аутентификации, то есть нужен только для того, чтобы сказать что пользователь действительно тот, за кого себя выдает. Вам же необходимо выполнять проверку прав доступа к сервису, а это задача уже не аутентификации, а авторизации. Для разграничения прав доступа к сервису используется ServiceAuthorizationManager. Попробуйте использовать его, только не на уровне Claimns, а на уровне разграничения по ролям. В этом случае у вас будут возвращаться на клиент нормальная ошибка AccessDeny. Если нужна какая то более гибкая настройка, то ройте в сторону разграничения прав на основе заявок (Claimns). |
||
| 20 окт 10, 14:48 [9641183] Ответить | Цитировать Сообщить модератору | |||
|
Lexxxxx Member Откуда: Сообщений: 858 |
А я подумал что уже здесь можно отбить пользователя, так как известно уже кто ломится к сервису. Просто не совсем (а скорее совсем не) понимаю что и как работает в WCF. |
||
| 20 окт 10, 15:42 [9641808] Ответить | Цитировать Сообщить модератору | |||
|
Lexxxxx Member Откуда: Сообщений: 858 |
Никто не подскажет, как в
class AuthorizationManager : ServiceAuthorizationManager
{
public override bool CheckAccess(OperationContext operationContext, ref Message message)
{
//....
}
}
|
| 21 дек 10, 11:36 [9971775] Ответить | Цитировать Сообщить модератору | |
|
Lexxxxx Member Откуда: Сообщений: 858 |
Никто не подскажет, как в
class MyAuthorizationManager : ServiceAuthorizationManager
{
public override bool CheckAccess(OperationContext operationContext, ref Message message)
{
//....
}
}в параметре message или operationContext добраться до параметров вызываемого метода, определить их число и значения. Само наименование метода как я понял можно получить используя например message.Headers.Action. |
| 21 дек 10, 11:40 [9971811] Ответить | Цитировать Сообщить модератору | |
| Все форумы / WCF, Web Services, Remoting | ![]() |
|