Ciao Moreno,
ciao filcat, mi riaggancio alla discussione da me iniziata, in quanto sono fermo anch'io sul problema di autenticazione tramite CNS.
La SOGEI, purtroppo, si limita ad indicare l'utilizzo dello "STANDARD di autenticazione tramite CNS", senza far alcun riferimento a nomi o documentazione alcuna, ed avevo pensato si trattasse di implementare la WS-Security, ovvero firma di un tag del messaggio SOAP e successiva implementazione nell'Header del messaggio tramite il tag Security, così come richiesto da altri web services, ma purtroppo così non è.
Da quello che mi hanno riferito ultimamente, l'autenticazione avviene "semplicemente", "presentando" il certificato della CNS al posto della Basic Authentication.
Mi hanno anche indicato un link dove secondo loro viene indicata la strada giusta e che riporta questo codice come funzionante, anche se riferito ad altro Web Service:
/// <summary>
///
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static HttpWebRequest CreateWebRequest(string url)
{
Uri uri = new Uri(url);
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
//Questo risolve l'errore 502 (Bad gateway)
webRequest.ProtocolVersion = HttpVersion.Version10;
webRequest.Proxy = null;
webRequest.Headers.Add("SOAP:Action");
webRequest.KeepAlive = true;
webRequest.ContentType = "text/xml;charset=\"utf-8\"";
webRequest.Accept = "text/xml";
webRequest.Method = "POST";
webRequest.AuthenticationLevel = AuthenticationLevel.MutualAuthRequired;
if (certificate != null)
{
webRequest.ClientCertificates.Add(certificate);
}
return webRequest;
}
dove sembra che
webRequest.AuthenticationLevel = AuthenticationLevel.MutualAuthRequired;
e
webRequest.ClientCertificates.Add(certificate);
risolvano il problema, ma non so come impostare tali parametri nella struttura di codice da me gestita:
......................................................
Dim myBinding As New BasicHttpsBinding()
myBinding.Security.Mode = BasicHttpsSecurityMode.Transport
' provo as indicare il tipo di accesso tramite certificato
myBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate
myBinding.MessageEncoding = WSMessageEncoding.Mtom
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
Client = New FSE_ComMetadati.comunicazioneMetadatiPTClient(myBinding, ea)
' m_CNS_Cert contiene il certificato estratto dalla CNS
Client.ClientCredentials.ClientCertificate.Certificate = m_CNS_Cert
Client.Endpoint.Contract.ProtectionLevel = ProtectionLevel.Sign
.....................................................................
.......................................................................
FSE_Ricevuta = Client.comunicazioneMetadati(FSE_Richiesta)
ma una volta effettuata la Request, il server SOGEI risponde inesorabilmente:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"/>
<env:Body>
<env:Fault>
<faultcode>env:Client</faultcode>
<faultstring>Internal Error (from client)</faultstring>
</env:Fault>
</env:Body>
</env:Envelope>
Sono sicuro che alla fine si tratterà di impostare correttamente 2/3 righe di codice .... Moreno, siamo nelle tue mani ...
Grazie mille.
Enzo