Я создаю основное веб-API-приложение asp.net, которое будет клиентом приложения служб WCF, работающего на компьютере с Windows.
Это мой класс обслуживания клиентов:
public class VITServicesClient : ServicesClient, IDisposable
{
static SpnEndpointIdentity spn = new SpnEndpointIdentity("BtaIntercardSPN");
static EndpointIdentity endPointIdent = (spn as EndpointIdentity);
static readonly NetTcpBinding binding;
public static string Address { get; set; }
private static AddressHeader addressHeader1 = AddressHeader.CreateAddressHeader("specialservice1", "http://localhost:8000/service", 1);
private static AddressHeader addressHeader2 = AddressHeader.CreateAddressHeader("specialservice2", "http://localhost:8000/service", 2);
private static AddressHeader[] addressHeaders = new AddressHeader[2] { addressHeader1, addressHeader2 };
static VITServicesClient()
{
binding = new NetTcpBinding(SecurityMode.Transport);
binding.Name = "NetTcpBinding";
TcpTransportSecurity transportSecurity = new TcpTransportSecurity();
transportSecurity.SslProtocols = SslProtocols.Tls12;
transportSecurity.ClientCredentialType = TcpClientCredentialType.Windows;
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport = transportSecurity;
binding.SendTimeout = new TimeSpan(0, 3, 0);
binding.MaxReceivedMessageSize = 1024 * 1024 * 100; //100MB max message size
}
public VITServicesClient() : base (binding, new EndpointAddress(new Uri(Address+":31716/IServices"), endPointIdent, addressHeaders))
{
}
public void Dispose()
{
}
}
И это веб-контроллер, который выполняет метод службы wcf:
public async Task<string> GetDocumentByCountryCode(string countryCode)
{
try
{
VITServicesClient.Address = "net.tcp://10.64.4.61";
using (var service = new VITServicesClient())
{
var result = await service.GetDocumentSamplesByCountryCodeAsync(countryCode.ToString(), 1);
return (result as DocumentSamplesData[])[0].document_code;
}
}
catch (Exception ex)
{
return "failed " + ex.Message + ex.InnerException.InnerException.Message;
}
}
Когда я запускаю клиентское приложение под Windows, проблем не возникает, но когда я развертываю приложение в Ubuntu 16.04 и запускаю его, и когда оно пытается подключиться к службе WCF на компьютере с Windows, я получаю это исключение - Ошибка вызова SSPI, см. Внутреннее исключение. Операция GSSAPI завершилась с ошибкой - указан неверный код состояния (SPNEGO не может найти механизмы для согласования)
Я искал об этой проблеме, и должна быть какая-то проблема с аутентификацией Kerberos в Windows.
Может быть, проблема в конфигурации, которую я использую в своем коде, или в Ubuntu могут быть параметры, которые нужно изменить.