Ho scritto un'applicazione Windows per verificare una connessione ai servizi Web SAP di un cliente. La chiamata al servizio web richiede la sicurezza del certificato X509.Connessione al servizio Web SAP dall'applicazione C# .NET
Dopo aver letto vari articoli su Internet, ho trovato tre modi per collegare il certificato X509 alla chiamata al servizio web. Sfortunatamente tutti questi tentativi restituiscono un 'accesso non autorizzato' 401. Tuttavia, posso collegarmi al servizio web tramite l'URL in IE.
Qualcuno ha qualche suggerimento su cosa potrei fare di sbagliato? Sto usando WSE 3.0 e tre metodi che sto usando per collegare il certificato sono i seguenti: -
Certificato
X509Certificate2 oCert = GetSecurityCertificate(oCertificate);
svc.ClientCertificates.Add(oCert);
Token
X509SecurityToken oToken = GetSecurityToken(oCertificate);
svc.RequestSoapContext.Security.Tokens.Add(oToken);
politica
SAPX509Assertion sapX509Assertion = new SAPX509Assertion(oCertificate, oStoreLocation, oStoreName, oFindType);
svc.SetPolicy(sapX509Assertion.Policy());
GetSecurityToken() e GetSecuirtyCertificate eseguono entrambe la ricerca nell'archivio certificati. Il SAPX509Assertion fa questo: -
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;
}
Aggiornamento OK, ho una chiamata WCF ora in atto. Non ho potuto utilizzare il metodo BasicHttpBinding mostrato da Eugarps in quanto lamentava il fatto che mi stavo connettendo a un indirizzo https e mi aspettavo http ... che avesse senso. Il codice che ora ho è: -
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);
Non riesce ancora a connettersi al servizio Web SAP. L'errore che sto ricevendo è "La richiesta HTTP non è autorizzata con lo schema di autenticazione del client 'Negoziare'". Ho anche provato a utilizzare
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
che ha restituito un errore simile.
Qualcuno ha ulteriori suggerimenti o idee su dove sto andando male?
'ZfhhrGbbapiZgeeamsCreateabsResponse' ... I miei occhi ... –
Lo so! Non è il più facile da usare delle convenzioni di denominazione. – grimorde