.net core 2 и выше: подключенные сервисы WcfServiceClient SOAP с авторизацией NTLM как? - PullRequest
0 голосов
/ 19 декабря 2018

Я запускаю приложение на .net core 2.1.Я добавил веб-сервис wsdl через подключенные сервисы, которые успешно сгенерировали мне WcfServiceClient.

При использовании Basic Autorization он работает отлично .

здеськласс, который я использую для вызова метода мыла helloword:

public string HellowWorld(string input)
{
    string wsRes = null;
    try
    {
        var service = new WorkerProcessServiceClient();
        var url = $"http://ServerUrl/Directory/WsName.svc";
        UriBuilder uriBuilder = new UriBuilder(url);

        service.Endpoint.Address = new EndpointAddress(uriBuilder.Uri);
        service.ClientCredentials.UserName.UserName = Username;
        service.ClientCredentials.UserName.Password = Password;

        using (OperationContextScope scope = new OperationContextScope(service.InnerChannel))
        {
            HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
            httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] =
                "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(service.ClientCredentials.UserName.UserName
                + ":"
                + service.ClientCredentials.UserName.Password));
            OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
            wsRes = service.HelloWorldAsync(input, RetailContext).GetAwaiter().GetResult();
            service.Close();
        }
    }
    catch (Exception ex)
    {
        wsRes = ex.Message;
    }
    return wsRes;
}

Это нормально работает с серверами, которые работают на Basic Authorization .Я использую те же учетные данные с SOAP UI , и он работает очень хорошо.и мне даже не нужно указывать enter image description here

<==> Проблема сейчас <=>

У меня есть второй сервер, который работает с Авторизация NTLM .Я сделал все это: '(но, похоже, ничего не работает.

1 - я изменил свой service.clientCredential.Username на service.clientCredential.Windows и добавил service.clientCredential.Windows.domain

2 - я также изменил заголовок с"Basic " + Convert... до "Ntlm " + Convert...

3 - я добавил домен в заголовок и поставил его в первую и последнюю позиции.

при использовании SOAP UI , онработает просто отлично. enter image description here

Я не знаю, что еще делать Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Я наконец-то узнал.

Итак, вот мой Новый код, чтобы получить сервис с NTLM-авторизацией

    private WcfServiceClient MyNtlmConfiguredService()
    {
        BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
        basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
        //this is for enabling Ntlm if you wanna work with basic you just 
        // you just replace HttpClientCredentialType.Ntlm by HttpClientCredentialType.Basic
        basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;

        EndpointAddress endpoint = new EndpointAddress("http://ServerUrl/Directory/WsName.svc");

        var client = new WcfServiceClient(basicHttpBinding, endpoint);

        NetworkCredential myCreds = new NetworkCredential("Username", "pas**rd", "Domain");

        client.ClientCredentials.Windows.ClientCredential = myCreds;
        client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

        return client;
    }

, а затем вы звоните в WebService обычно

MyNtlmConfiguredService().HellowWorld(input).getAwaiter().getResult();

сейчас Для получения базовой авторизации:

    private CustomerWcfServiceClient MyBasicConfiguredService()
    {
        var service = new CustomerWcfServiceClient();
        CustomerWcfServiceClient client = null;
        string wsRes = null;

        BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
        basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;//mandatory
        basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;//mandatory

        EndpointAddress endpoint = new EndpointAddress("http://ServerUrl/Directory/WsName.svc");

        client = new CustomerWcfServiceClient(basicHttpBinding, endpoint);


        client.ClientCredentials.UserName.UserName = "UserName";
        client.ClientCredentials.UserName.Password = "Pa**word";

        return client;
    }

и затем вы звоните в службу WebService обычно

MyBasicConfiguredService().HellowWorld(input).getAwaiter().getResult();

Счастливое кодирование каждый

0 голосов
/ 20 декабря 2018

Для проверки подлинности Windows: базовое приложение .net, передающее работающую идентификацию, например, оно запускает передачу идентификационной информации приложения, когда вы размещаете в IIS.

Вот два варианта для вас:

  1. Настройка основного приложения .net, запускаемого под учетной записью пользователя домена.
  2. Если вы предпочитаете настраивать имя пользователя и пароль в коде, вы можете попробовать WindowsIdentity.RunImpersonated.

    public class HomeController : Controller
    {
        [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
                int dwLogonType, int dwLogonProvider, out SafeAccessTokenHandle phToken);
        const int LOGON32_PROVIDER_DEFAULT = 0;
        //This parameter causes LogonUser to create a primary token.   
        const int LOGON32_LOGON_INTERACTIVE = 2;
        public IActionResult About()
        {
            SafeAccessTokenHandle safeAccessTokenHandle;
            bool returnValue = LogonUser("username", "domain", "password",
                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                out safeAccessTokenHandle);
            WindowsIdentity.RunImpersonated(safeAccessTokenHandle, () =>
            {
                NTLMWebServiceSoapClient client = new NTLMWebServiceSoapClient(NTLMWebServiceSoapClient.EndpointConfiguration.NTLMWebServiceSoap);
                var result = client.HelloWorldAsync().Result;
                ViewData["Message"] = result.Body.HelloWorldResult;
            });
    
            return View();
        }
    
    }
    
...