italia / anpr

Issue tracker e documentazione di ANPR - Anagrafe Nazionale della Popolazione Residente
Creative Commons Attribution 4.0 International
180 stars 49 forks source link

Invio Request tramite POST in .NET #338

Open GianM67 opened 7 years ago

GianM67 commented 7 years ago

Abbiamo generato in ambiente .NET una Request al WS 3002 (ambiente di pre-subentro - Comune di Rivoli - TO). L’abbiamo inviata al sistema utilizzando il metodo POST (riportiamo qui sotto il codice utilizzato). In risposta riceviamo il messaggio "connessione sottostante chiusa errore imprevisto durante un'operazione di invio". Non troviamo questo errore tra quelli generati da ANPR. L’errore può dipendere dal file di Request non corretto? Oppure il file di Request nemmeno arriva al sistema per un errore nel metodo post?

Codice metodo POST: public static void CallWebService(string responseEnvelope) {

        var _url = "https://wspre.anpr.interno.it/ANPR3000ServiziConsultazione/AnprService3000";
        var _action = "https://wspre.anpr.interno.it/ANPR3000ServiziConsultazione/AnprService3000?op=interrogazioneCittadino_famiglia_convivenza";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(responseEnvelope);

        HttpWebRequest webRequest = CreateWebRequest(_url, _action);
        InsertSoapEnvelopeIntoWebRequest(doc, webRequest);

        // begin async call to web request.
        IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);

        // suspend this thread until call is complete. You might want to
        // do something usefull here like update your UI.
        asyncResult.AsyncWaitHandle.WaitOne();

        // get the response from the completed web request.
        string soapResult;
        using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
        {
            using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
            {
                soapResult = rd.ReadToEnd();
            }
            Console.Write(soapResult);
        }
    }

    private static HttpWebRequest CreateWebRequest(string url, string action)
    {
        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
        webRequest.Headers.Add("SOAPAction", action);
        webRequest.ContentType = "text/xml;charset=\"utf-8\"";
        webRequest.Accept = "text/xml";
        webRequest.Method = "POST";
        return webRequest;
    }

    private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
    {
        using (Stream stream = webRequest.GetRequestStream())
        {
            soapEnvelopeXml.Save(stream);
        }
    }

Grazie. Manzin - Stesei

mccalv commented 7 years ago

Ciao, nel codice che alleghi non vedo come venga costruita la richiesta degli header SAML che gestiscono la sicurezza. Nell'area test comuni ci sono diversi tools per la creazione della connessione ad ANPR ed un esempio di header é il seguente (dalla documentazione Sogei):

`

XS sha1"/> qX2uM9tvgkvL9JFMqYlqPUwQOKc= mBblfDbqz1jTI4v+BG..................lJfEmXSEeiwAx9NpY= MIIEWTCCA0GgAwIBAgID.................rn3asP7f+tyf7hiA== CN=CA ANPR, O=Ministero Interni, C=it 42789 degli IdOperatore AuthnInstant="2015-07-14T14:19:25Z" urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified H501 Name="IdSede" H5012 YgXWjSwNewE2Y5cQ.........omissis.........FrNaPnXGw7SgcE2A= 12345 `
GianM67 commented 7 years ago

Grazie. Facciamo dunque una verifica del file Request generato seguendo il tuo esempio e riproviamo ad inviarlo. Nel caso ci risentiamo.

GianM67 commented 7 years ago

Ciao. Abbiamo fatto un controllo e l'header ci pare simile. A questo punto ti posto il file di Request generato (WS 3002). Penso sia utile.... Nel file di Request non abbiamo inserito il tocken....è giusto? Ti ringrazio per il contributo che puoi darci...

2017-10-02T12:57:11.705Z 2017-10-02T13:02:11.705Z Indagor hb7......WUeQwbYQY= d3jgGzDB................BQzDzCZWfqk2xyFXeRTQ== MIIE6zCC......................Nggz/T7czcRc3ojqHWz0BrFfMjjXQsOYtZBjObT1zKO4zvb5XJm2YuFDJNo/wsY6+oYrs3S31k/m16D idope urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified 000000 000000-xx-0000 MIAGCSqGSIb3D........................../N2krZ7/B+GG46y1MAYKHLjBOjI9vRNL0uYW0NzOVYBIwnWCPhDPNTuow4RrvzhwYw037LTlEn91Enxd5yjwMZ/LP0JXZcCH5v/0AAAAAAAA= STESEI Nq......TsVWwHDB8B4qSU= +0DCb4N.....Lqbx85DT2A= XBnNzQ2.....................2Pm71K0UXDPVTc9eGN6VPwg4Ye62uQSypeevTjXwcZ8A== MIIE6zCCAtOgAwIBAgIIJdOCVM..................................T7czcRc3ojqHWz0BrFfMjjXQsOYtZBjObT1zKO4zvb5XJm2YuFDJNo/wsY6+oYrs3S31k/m16D
1 000000 ANPR00 3002 2017-05-09T19:05:11.543+02:00 C PRE_SUB 000 1 2017-05-09+02:00 1

Ciao.

GianM67 commented 7 years ago

Scusa, ti posto di nuovo il file di Request....ho paura di non averlo postato bene nel messaggio precedente. Grazie.

2017-10-02T12:57:11.705Z2017-10-02T13:02:11.705ZIndagorhb7......WUeQwbYQY=d3jgGzDB................BQzDzCZWfqk2xyFXeRTQ==MIIE6zCC......................Nggz/T7czcRc3ojqHWz0BrFfMjjXQsOYtZBjObT1zKO4zvb5XJm2YuFDJNo/wsY6+oYrs3S31k/m16Didopeurn:oasis:names:tc:SAML:2.0:ac:classes:unspecified000000000000-xx-0000MIAGCSqGSIb3D........................../N2krZ7/B+GG46y1MAYKHLjBOjI9vRNL0uYW0NzOVYBIwnWCPhDPNTuow4RrvzhwYw037LTlEn91Enxd5yjwMZ/LP0JXZcCH5v/0AAAAAAAA=STESEINq......TsVWwHDB8B4qSU=+0DCb4N.....Lqbx85DT2A=XBnNzQ2.....................2Pm71K0UXDPVTc9eGN6VPwg4Ye62uQSypeevTjXwcZ8A==MIIE6zCCAtOgAwIBAgIIJdOCVM..................................T7czcRc3ojqHWz0BrFfMjjXQsOYtZBjObT1zKO4zvb5XJm2YuFDJNo/wsY6+oYrs3S31k/m16D
1000000ANPR0030022017-05-09T19:05:11.543+02:00CPRE_SUB00012017-05-09+02:001
GianM67 commented 7 years ago

..porta pazienza...a vista mi sembra manchino dei pezzi...ho allegato il file. Grazie

Request.xml.txt

GianM67 commented 7 years ago

Buongiorno. Abbiamo effettuato ancora qualche prova ma l'invio della request ci ha sempre restituito l'errore "connessione sottostante chiusa errore imprevisto durante un'operazione di invio". Ti saremmo grati se riuscissi a verificare la correttezza del file che abbiamo allegato. Grazie per un tuo riscontro. Buona giornata. Manzin - Stesei

mccalv commented 7 years ago

Salve,allego un esempio di connessione corretta (con rimozione parziale dei valori dei certificati) come da client ti esempio allegato nel test comuni. Da una prima analisi l'errore potrebbe essere nei nodo ds:KeyInfo o nei timestamp connGood.xml.txt

GianM67 commented 7 years ago

Ciao. Stiamo tentando di generare un file di request simile a quello che ci hai fornito tu come esempio, riscontrando alcune difficoltà. Non vorremmo che alla base ci fosse un problema di ambiente di sviluppo. Noi stiamo infatti programmando le procedure di connessione in mondo .NET (dalle specifiche abbiamo visto che è possibile). E’ vero però che le librerie SAML disponibili per il mondo NET non sono recenti (le ultime datano 2010). Abbiamo poi notato che gli esempi di tools da Voi resi disponibili per il collegamento sono solamente in ambiente Java. Ti chiedo a questo punto: avete esperienza sul buon esito di file di request effettuati tramite .NET? Avete indicazioni (o materiale) da fornirci su questo ambiente? Grazie mille. Ciao. Manzin - Stesei

Eduardo1977 commented 7 years ago

Buongiorno, posso confermare che in .NET c'è qualche problema, o meglio dire "qualcosa" che manca per configurare il tutto in modo che funzioni. Non ho ancora capito se il "qualcosa" manca del tutto o è solo difficile da reperire (gratuitamente). Non voglio annoiarvi raccontandovi tutti i tentativi fatti e il tempo perso, però posso dare delle indicazioni che possono servire:

Eduardo Gira

RaffaeleReale commented 7 years ago

Ciao noi abbiamo sviluppato il tutto in .NET ed in verità con non pochi problemi: ma non giurerei sul fatto che tutto sia dovuto al framework stesso. Inizio con il riprendere quanto detto da @Eduardo1977 : vero per il primo punto (versione minimo 4.5) e per il secondo punto (SI a BouncyCastle). Invece per Security Token Service non ce ne stato bisogno. Noi ora siamo al punto che:

  1. in ambiente di test funziona tutto dall'invio del file di subentro (ripeto in ambiente di test) ai vari servizi di consultazione / certificazione / variazioni / ecc. Tutto OK!
  2. in ambiente di PRESUBENTRO invece paradossalmente non ci funziona l'invio del file del subentro (restituendoci il fatidico errore che riscontri anche tu @GianM67 "connessione sottostante chiusa errore imprevisto durante un'operazione di invio"); una volta poi effettuato il presubentro facendo l'upload manuale dei file dalla web app tutto per magia funziona: servizi di consultazione / certificazione / variazioni / ecc.

Quindi visto questo, sinceramente, non mi viene da pensare che sia un problema del framework ma c'è qualcosa di strano a che a noi sfugge sicuramente nel nostro caso nell'invio del subentro in un ambiente di PRESUBENTRO e ripeto stranamento lo stesso servizio si subentro ma in ambiente di test funziona (ovviamente provato per lo stesso comune quindi con gli stessi dati)

GianM67 commented 7 years ago

Grazie molte per i contributi. Avendo già utilizzato la versione 4.5 del Framework, proviamo ad utilizzare le librerie BouncyCastle come da Voi suggerito e riporteremo qui i risultati.

Eduardo1977 commented 7 years ago

Grazie @RaffaeleReale per aver condiviso l'esperienza avuta. Confermo che il problema è in PRESUBENTRO. E confermo che secondo me non c'è motivo di usare un STS, ma come già scritto sembra che per adottare la configurazione migliore si sia quasi obbligati ad utilizzarlo.

GianM67 commented 7 years ago

Buongiorno. Abbiamo provato ad utilizzare le librerie Bouncy Castle. Al momento ci stiamo però ancora confrontando con un problema che non ci consente di estrarre la chiave privata del certificato. A prescindere da questo, domanda: nel momento in cui inviamo una Request, è prevista la possibilità di avere dei log che ci aiutino a capire più nel dettaglio il motivo dello scarto? Grazie molte.

Eduardo1977 commented 7 years ago

Buongiorno, se non avete già provato, potrebbe esservi utile aggiungere il 'diagnostic tracing' nel web.config : https://docs.microsoft.com/en-us/dotnet/framework/wcf/diagnostics/tracing/configuring-tracing https://docs.microsoft.com/en-us/dotnet/framework/debug-trace-profile/how-to-create-and-initialize-trace-listeners

RaffaeleReale commented 7 years ago

Ciao, noi ora a seguito di una richiesta all'assistenza tecnica per l'errore rilevato in fase di presubentro tramite webservice (che menzionavo sopra), la scorsa settimana sono stati effettuati degli interventi da parte di SOGEI ed ora siamo stati in grado di effettuare il tutto con successo. Quindi ora tutti i ws invocati tramite il framework .net sembrano rispondere in modo corretto sia in ambiente di test che presubenrtro. Farò dei test più approfonditi e vi informerò qui.

GianM67 commented 7 years ago

Ciao. Grazie per l'aggiornamento @RaffaeleReale . Mi confermi solamente che avete utilizzato le librerie BouncyCastle ?

RaffaeleReale commented 7 years ago

Si, ed in realtà solo per firmare l'IdPostazione

Eduardo1977 commented 6 years ago

Ciao @RaffaeleReale posso chiederti che tipo di binding avete utilizzato per AnprPortType6001Client ?

Eduardo1977 commented 6 years ago

Buongiorno, vorremmo capire in cosa consiste "problema-client" per le chiamate in .NET Noi continuiamo a ricevere:

ERRORE: System.ServiceModel.FaultException: Internal Error (from server)

Si potrebbe controllare lato server cosa sta succedendo? Grazie

Eduardo Gira Servizi Locali SpA

gcarbonin commented 6 years ago

Per effettuare un controllo, ci dovrebbe almeno dire il comune e quando ha fatto il test.

Eduardo1977 commented 6 years ago

Ambiente Presubentro. Comune di di Bistagno (006017). Nell'ultima ora fatte varie chiamate. Grazie.

Leonforte commented 6 years ago

Salve, se ci inviate la request via mail la verifichiamo, grazie

Eduardo1977 commented 6 years ago

Si stavo scrivendo.

RaffaeleReale commented 6 years ago

Ciao @Eduardo1977 in realtà non usiamo la tecnica dei webservices "classica" quindi nessun binding gestito (anche perché non abbiamo capito a che standard rispondono i servizi messi a disposizione da ANPR). Le chiamata le gestiamo tramite post su httpwebrequest: è stato l'unico modo per farli funzionare per quanto ci riguarda.

Eduardo1977 commented 6 years ago

Ciao @RaffaeleReale, in effetti sto cercando di realizzare il client con la tecnica "classica" importando i WSDL. Secondo me, .NET non "traduce" bene e genera classi che non funzionano correttamente, soprattutto a causa delle policy referenziate in un file esterno "policy-X509v3.xml". Infine, bisognerebbe sempre capire che tipo di binding utilizzare... Comunque, ho provato anche l'altra tecnica, però tramite post su HttpRequestMessage utilizzando un soap corretto e valido. Il risultato è sempre "Internal Error (from server)": dalla sogei proprio oggi mi hanno detto di non provare più chiamate di questo tipo che così non funziona. Grazie a tutti e Auguri di Buon Anno

Eduardo1977 commented 6 years ago

Ok stamattina finalmente funziona tutto tramite post su HttpRequestMessage ... Ho fatto qualche ritocco al codice, ma in realtà stamattina avevo installato i certificati pubblicati proprio ieri (vedi issue #474: "Aggiungere la CA Postazioni Svil al trust store"). Che dipenda da quello? Adesso non ho tempo di fare altre prove a disinstallare i certificati dallo store...

RaffaeleReale commented 6 years ago

Non credo sia un problema dei certificati #474 perché già noi abbiamo mandato in produzione presso dei comuni e da loro non abbiamo fatto attività di questo tipo e funziona ugualmente.

Eduardo1977 commented 6 years ago

Ok grazie ancora

marcx2014 commented 6 years ago

Volendo è possibile usare anche WCF + WIF + le classi di crittografia standard .NET 4.5. Ho testato nel 2016 solo il servizio di connessione di test e pareva funzionare ma la complessità è tale che consiglio comunque l'approccio vecchio stile. Per chi volesse comunque cimentarsi con i WCF sappia che occorre costruire un customer text message encoder per inserire token e timestamp all'interno del messaggio costruito dal WCF ed inoltre utilizzare un custom binding.