Basic аутентификация на WCF сервисе
От: Кондраций Россия  
Дата: 12.11.10 21:34
Оценка:
Задача в целом стоит так: есть некий web-сервис далеко от меня, на яве писаный. Требует аутентификации, судя по всему Basic access authentication. Нужно написать клиента (WCF) для него. Клиент в целом написан, нужно прикрутить аутентификацию. Для тестовых целей пишется web-сервис (WCF), который должен требовать Basic аутентификации.
  Скрытый текст
Код клиента:
                var bnd = new BasicHttpBinding();
                bnd.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                bnd.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

                EndpointAddress addr = new EndpointAddress( "http://localhost:8081/myservice" );
                var client = new MyServiceClient( bnd, addr);
                client.ClientCredentials.UserName.UserName = txtLogin.Text.Trim();
                client.ClientCredentials.UserName.Password = txtPsw.Text.Trim();

                DoItRequest request = new DoItRequest( int.Parse( txtNumber.Text.Trim() ) );

                var response = client.DoIt( request );
                txtResult.Text = response.DoItResult;


Код сервера:
        static void Main(string[] args)
        {
            Uri baseAdress = new Uri( "http://localhost:8081/myservice" );

            using (ServiceHost host = new ServiceHost(typeof(MyService), baseAdress))
            {
                ServiceMetadataBehavior mex = new ServiceMetadataBehavior();
                mex.HttpGetEnabled = true;
                host.Description.Behaviors.Add( mex );

                Uri uri = new Uri( "http://localhost:8081/myservice" );

                var bnd = new BasicHttpBinding();
                bnd.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                bnd.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
                //bnd.Security.Transport.Realm = "myservice"; // <-- не понял, зачем нужен Realm, использовал метод научного тыка

                host.AddServiceEndpoint( typeof(MyService), bnd, uri );

                host.Open();

                Console.WriteLine( "Started" );
                Console.ReadKey( true );

                host.Close();
                Console.WriteLine("Stopped");
            }
        }

Вызов с клиента заканчивается ошибкой: "The HTTP request was forbidden with client authentication scheme 'Basic'."
Анализатор трафика показывает, что обмен запросами между клиентом и сервером адекватен basic аутентификации, т.е. сначала возвращается код 401 с WWW-Authenticate, на что посылается новый запрос с Authorization:Basic RGltYTpteXBzdw==. И сервер в ответ возвращает код 403 Forbidden.

Вопрос: где и в каком месте сервис принимает решение, что клиента нужно отшить? Как его заставить вернуть код 200 OK?
Сообщение заговорено потомственным колдуном, целителем и магом в девятом поколении!
Модерирование или минусование сообщения ведет к половому бессилию, венерическим заболеваниям, венцу безбрачия и диарее!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.