He escrito una aplicación de Windows para probar una conexión a los servicios web SAP de un cliente. La llamada al servicio web requiere seguridad del certificado X509.Conexión al servicio web de SAP desde la aplicación C# .NET
Después de leer varios artículos en Internet, he encontrado tres formas de adjuntar el certificado X509 a la llamada del servicio web. Lamentablemente, todos estos intentos devuelven un '401 acceso no autorizado'. Sin embargo, puedo conectarme al servicio web a través de la URL en IE.
¿Alguien tiene alguna pregunta sobre lo que puedo estar haciendo mal? Estoy usando WSE 3.0 y los tres métodos que estoy usando para fijar el certificado son los siguientes: -
Certificado
X509Certificate2 oCert = GetSecurityCertificate(oCertificate);
svc.ClientCertificates.Add(oCert);
simbólico Política
X509SecurityToken oToken = GetSecurityToken(oCertificate);
svc.RequestSoapContext.Security.Tokens.Add(oToken);
SAPX509Assertion sapX509Assertion = new SAPX509Assertion(oCertificate, oStoreLocation, oStoreName, oFindType);
svc.SetPolicy(sapX509Assertion.Policy());
GetSecurityToken() y GetSecuirtyCertificate buscan en el almacén de certificados. El SAPX509Assertion hace esto: -
public SAPX509Assertion(String certSubject, StoreLocation oStoreLocation, StoreName oStoreName, X509FindType oFindType)
{
ClientX509TokenProvider = new X509TokenProvider(oStoreLocation,
oStoreName, certSubject, oFindType);
ServiceX509TokenProvider = new X509TokenProvider(oStoreLocation,
oStoreName, certSubject, oFindType);
Protection.Request.EncryptBody = false;
Protection.Response.EncryptBody = false;
}
actualización bien, tengo una llamada de WCF ahora en su lugar. No pude usar el método BasicHttpBinding mostrado por Eugarps ya que se quejaba de que me estaba conectando a una dirección https y esperaba http ... lo cual tenía sentido. El código que ahora tengo es: -
var binding = new WSHttpBinding();
binding.MaxReceivedMessageSize = int.MaxValue;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
binding.Security.Mode = SecurityMode.Transport;
WCFConnection.CreateAbsenceWSlow.ZWSDHTM_GB_AMS_CREATEABS_lowClient client;
CreateAbsenceWSlow.ZfhhrGbbapiZgeeamsCreateabsResponse response;
CreateAbsenceWSlow.ZfhhrGbbapiZgeeamsCreateabs data;
//Assign address
var address = new EndpointAddress(sUrl);
//Create service client
client = new CreateAbsenceWSlow.ZWSDHTM_GB_AMS_CREATEABS_lowClient(binding, address);
//Assign credentials
client.ClientCredentials.UserName.UserName = sUserName;
client.ClientCredentials.UserName.Password = sPassword;
response = new CreateAbsenceWSlow.ZfhhrGbbapiZgeeamsCreateabsResponse();
data = new WCFConnection.CreateAbsenceWSlow.ZfhhrGbbapiZgeeamsCreateabs();
response = client.ZfhhrGbbapiZgeeamsCreateabs(data);
Todavía no se puede conectar al servicio web de SAP. El error que recibo es "La solicitud HTTP no está autorizada con el esquema de autenticación del cliente 'Negociar'". También probé usando
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
que arrojó un error similar.
¿Alguien tiene alguna otra sugerencia o idea de dónde me estoy equivocando?
'ZfhhrGbbapiZgeeamsCreateabsResponse' ... Mis ojos ... –
Lo sé! No es el más fácil de usar de las convenciones de nombres. – grimorde