Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WCF, Web Services, Remoting Новый топик    Ответить
 Пользовательский ServiceAuthenticationManager  [new]
Lexxxxx
Member

Откуда:
Сообщений: 858
Пытаюсь ограничить доступ к службе с привязкой NetTcpBinding(SecurityMode.Transport) и TcpClientCredentialType.Windows определенной группой пользователей Windows. В найденных примерах в интернете все почему-то пользуются переопределением ServiceAutorizationManager или развешивают атрибут PrincipalPermission. Но ведь вроде как правильно будет определять на этапе аутентификации, а не авторизации, разрешено ли пользователю подключаться к сервису? Собственно с реализацией каркаса пользовательского ServiceAuthenticationManager и его подключением проблем нет. Но вот что делать в ServiceAuthenticationManager.Authenticate() чтобы определить кто именно ломится и как узнать принадлежит ли он к нужной нам группе? Никто не пытался реализовывать свой ServiceAuthenticationManager?
19 окт 10, 15:38    [9634912]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательский ServiceAuthenticationManager  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательский ServiceAuthenticationManager  [new]
Lexxxxx
Member

Откуда:
Сообщений: 858
Однако кривое решение. В журнале сообщений имеем:

InvalidOperationException: Метод проверки подлинности в
ServiceAuthenticationManager вернул значение NULL.
Если в коллекции не нужен возврат политик авторизации,
необходимо вернуть пустой объект ReadOnlyCollection.

А если выполнить рекомендации, то аутентификация проходит без проблем. Так как по нормальному ограничить доступ к сервису на этапе аутентификации?
20 окт 10, 14:02    [9640784]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательский ServiceAuthenticationManager  [new]
heeepi
Member

Откуда:
Сообщений: 15
Lexxxxx
Однако кривое решение. В журнале сообщений имеем:InvalidOperationException: Метод проверки подлинности вServiceAuthenticationManager вернул значение NULL.Если в коллекции не нужен возврат политик авторизации,необходимо вернуть пустой объект ReadOnlyCollection.А если выполнить рекомендации, то аутентификация проходит без проблем. Так как по нормальному ограничить доступ к сервису на этапе аутентификации?

ServiceAuthenticationManager необходим для аутентификации, то есть нужен только для того, чтобы сказать что пользователь действительно тот, за кого себя выдает. Вам же необходимо выполнять проверку прав доступа к сервису, а это задача уже не аутентификации, а авторизации.
Для разграничения прав доступа к сервису используется ServiceAuthorizationManager. Попробуйте использовать его, только не на уровне Claimns, а на уровне разграничения по ролям. В этом случае у вас будут возвращаться на клиент нормальная ошибка AccessDeny.
Если нужна какая то более гибкая настройка, то ройте в сторону разграничения прав на основе заявок (Claimns).
20 окт 10, 14:48    [9641183]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательский ServiceAuthenticationManager  [new]
Lexxxxx
Member

Откуда:
Сообщений: 858
heeepi
ServiceAuthenticationManager необходим для аутентификации, то есть нужен только для того, чтобы сказать что пользователь действительно тот, за кого себя выдает. Вам же необходимо выполнять проверку прав доступа к сервису, а это задача уже не аутентификации, а авторизации.

А я подумал что уже здесь можно отбить пользователя, так как известно уже кто ломится к сервису. Просто не совсем (а скорее совсем не) понимаю что и как работает в WCF.
20 окт 10, 15:42    [9641808]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательский ServiceAuthenticationManager  [new]
Lexxxxx
Member

Откуда:
Сообщений: 858
Никто не подскажет, как в
class AuthorizationManager : ServiceAuthorizationManager
    {
        public override bool CheckAccess(OperationContext operationContext, ref Message message)
            {
                //....
            }
    }
21 дек 10, 11:36    [9971775]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательский ServiceAuthenticationManager  [new]
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 Ответить