Задача в целом стоит так: есть некий 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?
Сообщение заговорено потомственным колдуном, целителем и магом в девятом поколении!
Модерирование или минусование сообщения ведет к половому бессилию, венерическим заболеваниям, венцу безбрачия и диарее!