Мигрировать WSE в WCF - PullRequest
       33

Мигрировать WSE в WCF

1 голос
/ 25 апреля 2019
 using Microsoft.Web.Services2;
 using Microsoft.Web.Services2.Security;
 using Microsoft.Web.Services2.Security.Tokens;
 using Microsoft.Web.Services2.Security.X509;

 public void ConfigureService(string username, string password, string certKey)
 {
        var service = new WebServicesClientProtocol();

        service.Url = url;

        service.RequestSoapContext.Security.Tokens.Add(new UsernameToken(username, password, PasswordOption.SendPlainText));

        var store = X509CertificateStore.LocalMachineStore(X509CertificateStore.MyStore);
        store.OpenRead();

        var cert = store.FindCertificateBySubjectString(certKey)[0];

        var clientToken = new X509SecurityToken(cert);

        store.Close();

        service.RequestSoapContext.Security.Tokens.Add(clientToken);

        var signature = new MessageSignature(clientToken);
        service.RequestSoapContext.Security.Elements.Add(signature);
}

Это просто инициализация протокола WebServicesClientProtocol, остальные - просто вызов конечных точек.

Это код, который используется для связи со службой.Можно ли написать только на WCF, чтобы не использовать WSE?

Я пытался

            var binding = new BasicHttpsBinding(BasicHttpsSecurityMode.TransportWithMessageCredential);
        binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;

        var address = new EndpointAddress(endpointAddress);
        var client = new ServiceSoapClient(binding, address);

        client.ClientCredentials.ClientCertificate.SetCertificate(
            StoreLocation.LocalMachine,
            StoreName.My,
            X509FindType.FindBySubjectName,
            certName);

        client.ClientCredentials.UserName.UserName = username
        client.ClientCredentials.UserName.Password = password;

Но это не работает, я просто получаю

System.Web.Services.Protocols.SoapException: Access to the operation is not present.
  at RecieversNamespace.Framework.ProcessMessage(SoapMessage message)
  at System.Web.Services.Protocols.SoapMessage.RunExtensions(SoapExtension[] extensions, Boolean throwOnException)
  at System.Web.Services.Protocols.SoapServerProtocol.CreateServerInstance()
  at System.Web.Services.Protocols.WebServiceHandler.Invoke()
  at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()

System.Web.Services.Protocols.SoapException: Доступ к операции неприсутствует.

Когда я добавляю конечную точку службы, я не уверен, как настроить привязки для репликации кода выше.В частности, часть MessageSignature.

Спасибо

...