private static UInt32 _globalUniqueID = 0; // OJO! NO ES THREAD-SAFE /// <summary> /// Construye un Login Ticket obtenido del WSAA /// </summary> /// <param name="argServicio">Servicio al que se desea acceder</param> /// <param name="argUrlWsaa">URL del WSAA</param> /// <param name="argRutaCertX509Firmante">Ruta del certificado X509 (con clave privada) usado para firmar</param> /// <param name="argPassword">Password del certificado X509 (con clave privada) usado para firmar</param> /// <param name="argProxy">IP:port del proxy</param> /// <param name="argProxyUser">Usuario del proxy</param> /// <param name="argProxyPassword">Password del proxy</param> /// <param name="argVerbose">Nivel detallado de descripcion? true/false</param> /// <remarks></remarks> public string ObtenerLoginTicketResponse(string argServicio, string argUrlWsaa, string argRutaCertX509Firmante, SecureString argPassword, string argProxy, string argProxyUser, string argProxyPassword, bool argVerbose) { const string ID_FNC = "[ObtenerLoginTicketResponse]"; this.RutaDelCertificadoFirmante = argRutaCertX509Firmante; this._verboseMode = argVerbose; CertificadosX509Lib.VerboseMode = argVerbose; string cmsFirmadoBase64 = null; string loginTicketResponse = null; XmlNode xmlNodoUniqueId = default(XmlNode); XmlNode xmlNodoGenerationTime = default(XmlNode); XmlNode xmlNodoExpirationTime = default(XmlNode); XmlNode xmlNodoService = default(XmlNode); // PASO 1: Genero el Login Ticket Request try { _globalUniqueID += 1; XmlLoginTicketRequest = new XmlDocument(); XmlLoginTicketRequest.LoadXml(XmlStrLoginTicketRequestTemplate); xmlNodoUniqueId = XmlLoginTicketRequest.SelectSingleNode("//uniqueId"); xmlNodoGenerationTime = XmlLoginTicketRequest.SelectSingleNode("//generationTime"); xmlNodoExpirationTime = XmlLoginTicketRequest.SelectSingleNode("//expirationTime"); xmlNodoService = XmlLoginTicketRequest.SelectSingleNode("//service"); /* * Agregar también los campos source y destination * ¿ Por que -10 min. al tiempo de generación y +10 al tiempo de expiración? * * * */ xmlNodoGenerationTime.InnerText = DateTime.Now.AddMinutes(-10).ToString("s"); xmlNodoExpirationTime.InnerText = DateTime.Now.AddMinutes(+10).ToString("s"); xmlNodoUniqueId.InnerText = Convert.ToString(_globalUniqueID); xmlNodoService.InnerText = argServicio; this.Service = argServicio; if (this._verboseMode) { Console.WriteLine(XmlLoginTicketRequest.OuterXml); } } catch (Exception excepcionAlGenerarLoginTicketRequest) { throw new Exception(ID_FNC + "***Error GENERANDO el LoginTicketRequest : " + excepcionAlGenerarLoginTicketRequest.Message + excepcionAlGenerarLoginTicketRequest.StackTrace); } // PASO 2: Firmo el Login Ticket Request try { if (this._verboseMode) { Console.WriteLine(ID_FNC + "***Leyendo certificado: {0}", RutaDelCertificadoFirmante); } X509Certificate2 certFirmante = CertificadosX509Lib.ObtieneCertificadoDesdeArchivo(RutaDelCertificadoFirmante, argPassword); if (this._verboseMode) { Console.WriteLine(ID_FNC + "***Firmando: "); Console.WriteLine(XmlLoginTicketRequest.OuterXml); } // Convierto el Login Ticket Request a bytes, firmo el msg y lo convierto a Base64 Encoding EncodedMsg = Encoding.UTF8; byte[] msgBytes = EncodedMsg.GetBytes(XmlLoginTicketRequest.OuterXml); byte[] encodedSignedCms = CertificadosX509Lib.FirmaBytesMensaje(msgBytes, certFirmante); cmsFirmadoBase64 = Convert.ToBase64String(encodedSignedCms); } catch (Exception excepcionAlFirmar) { throw new Exception(ID_FNC + "***Error FIRMANDO el LoginTicketRequest : " + excepcionAlFirmar.Message); } // PASO 3: Invoco al WSAA para obtener el Login Ticket Response try { if (this._verboseMode) { Console.WriteLine(ID_FNC + "***Llamando al WSAA en URL: {0}", argUrlWsaa); Console.WriteLine(ID_FNC + "***Argumento en el request:"); Console.WriteLine(cmsFirmadoBase64); } ClienteLoginCms_CS.Wsaa.LoginCMSService servicioWsaa = new ClienteLoginCms_CS.Wsaa.LoginCMSService(); servicioWsaa.Url = argUrlWsaa; // Veo si hay que salir a traves de un proxy if (argProxy != null) { if (argProxy != "") { servicioWsaa.Proxy = new WebProxy(argProxy, true); if (argProxyUser != null) { NetworkCredential Credentials = new NetworkCredential(argProxyUser, argProxyPassword); servicioWsaa.Proxy.Credentials = Credentials; } } } loginTicketResponse = servicioWsaa.loginCms(cmsFirmadoBase64); if (this._verboseMode) { Console.WriteLine(ID_FNC + "***LoguinTicketResponse: "); Console.WriteLine(loginTicketResponse); } } catch (Exception excepcionAlInvocarWsaa) { throw new Exception(ID_FNC + "***Error INVOCANDO al servicio WSAA : " + excepcionAlInvocarWsaa.Message); } // PASO 4: Analizo el Login Ticket Response recibido del WSAA try { XmlLoginTicketResponse = new XmlDocument(); XmlLoginTicketResponse.LoadXml(loginTicketResponse); this.UniqueId = UInt32.Parse(XmlLoginTicketResponse.SelectSingleNode("//uniqueId").InnerText); this.GenerationTime = DateTime.Parse(XmlLoginTicketResponse.SelectSingleNode("//generationTime").InnerText); this.ExpirationTime = DateTime.Parse(XmlLoginTicketResponse.SelectSingleNode("//expirationTime").InnerText); this.Sign = XmlLoginTicketResponse.SelectSingleNode("//sign").InnerText; this.Token = XmlLoginTicketResponse.SelectSingleNode("//token").InnerText; } catch (Exception excepcionAlAnalizarLoginTicketResponse) { throw new Exception(ID_FNC + "***Error ANALIZANDO el LoginTicketResponse : " + excepcionAlAnalizarLoginTicketResponse.Message); } return(loginTicketResponse); }
/// <summary> /// Construye un Login Ticket obtenido del WSAA /// </summary> /// <param name="argServicio">Servicio al que se desea acceder</param> /// <param name="argUrlWsaa">URL del WSAA</param> /// <param name="argRutaCertX509Firmante">Ruta del certificado X509 (con clave privada) usado para firmar</param> /// <param name="argVerbose">Nivel detallado de descripcion? true/false</param> /// <remarks></remarks> public string ObtenerLoginTicketResponse(string argServicio, string argUrlWsaa, string argRutaCertX509Firmante, bool argVerbose) { this.RutaDelCertificadoFirmante = argRutaCertX509Firmante; this._verboseMode = argVerbose; CertificadosX509Lib.VerboseMode = argVerbose; string cmsFirmadoBase64; string loginTicketResponse; XmlNode xmlNodoUniqueId; XmlNode xmlNodoGenerationTime; XmlNode xmlNodoExpirationTime; XmlNode xmlNodoService; // PASO 1: Genero el Login Ticket Request try { XmlLoginTicketRequest = new XmlDocument(); XmlLoginTicketRequest.LoadXml(XmlStrLoginTicketRequestTemplate); xmlNodoUniqueId = XmlLoginTicketRequest.SelectSingleNode("//uniqueId"); xmlNodoGenerationTime = XmlLoginTicketRequest.SelectSingleNode("//generationTime"); xmlNodoExpirationTime = XmlLoginTicketRequest.SelectSingleNode("//expirationTime"); xmlNodoService = XmlLoginTicketRequest.SelectSingleNode("//service"); xmlNodoGenerationTime.InnerText = DateTime.Now.AddMinutes(-10).ToString("s"); xmlNodoExpirationTime.InnerText = DateTime.Now.AddMinutes(+10).ToString("s"); xmlNodoUniqueId.InnerText = Convert.ToString(_globalUniqueID); xmlNodoService.InnerText = argServicio; this.Service = argServicio; _globalUniqueID += 1; if (this._verboseMode) { Console.WriteLine(XmlLoginTicketRequest.OuterXml); } } catch (Exception excepcionAlGenerarLoginTicketRequest) { throw new Exception("***Error GENERANDO el LoginTicketRequest : " + excepcionAlGenerarLoginTicketRequest.Message); } // PASO 2: Firmo el Login Ticket Request try { if (this._verboseMode) { Console.WriteLine("***Leyendo certificado: {0}", RutaDelCertificadoFirmante); } X509Certificate2 certFirmante = CertificadosX509Lib.ObtieneCertificadoDesdeArchivo(RutaDelCertificadoFirmante); if (this._verboseMode) { Console.WriteLine("***Firmando: "); Console.WriteLine(XmlLoginTicketRequest.OuterXml); } // Convierto el login ticket request a bytes, para firmar Encoding EncodedMsg = Encoding.UTF8; byte[] msgBytes = EncodedMsg.GetBytes(XmlLoginTicketRequest.OuterXml); // Firmo el msg y paso a Base64 byte[] encodedSignedCms = CertificadosX509Lib.FirmaBytesMensaje(msgBytes, certFirmante); cmsFirmadoBase64 = Convert.ToBase64String(encodedSignedCms); } catch (Exception excepcionAlFirmar) { throw new Exception("***Error FIRMANDO el LoginTicketRequest : " + excepcionAlFirmar.Message); } // PASO 3: Invoco al WSAA para obtener el Login Ticket Response try { if (this._verboseMode) { Console.WriteLine("***Llamando al WSAA en URL: {0}", argUrlWsaa); Console.WriteLine("***Argumento en el request:"); Console.WriteLine(cmsFirmadoBase64); } ClienteLoginCms_CS.Wsaa.LoginCMSService servicioWsaa = new ClienteLoginCms_CS.Wsaa.LoginCMSService(); servicioWsaa.Url = argUrlWsaa; loginTicketResponse = servicioWsaa.loginCms(cmsFirmadoBase64); if (this._verboseMode) { Console.WriteLine("***LoguinTicketResponse: "); Console.WriteLine(loginTicketResponse); } } catch (Exception excepcionAlInvocarWsaa) { throw new Exception("***Error INVOCANDO al servicio WSAA : " + excepcionAlInvocarWsaa.Message); } // PASO 4: Analizo el Login Ticket Response recibido del WSAA try { XmlLoginTicketResponse = new XmlDocument(); XmlLoginTicketResponse.LoadXml(loginTicketResponse); this.UniqueId = UInt32.Parse(XmlLoginTicketResponse.SelectSingleNode("//uniqueId").InnerText); this.GenerationTime = DateTime.Parse(XmlLoginTicketResponse.SelectSingleNode("//generationTime").InnerText); this.ExpirationTime = DateTime.Parse(XmlLoginTicketResponse.SelectSingleNode("//expirationTime").InnerText); this.Sign = XmlLoginTicketResponse.SelectSingleNode("//sign").InnerText; this.Token = XmlLoginTicketResponse.SelectSingleNode("//token").InnerText; } catch (Exception excepcionAlAnalizarLoginTicketResponse) { throw new Exception("***Error ANALIZANDO el LoginTicketResponse : " + excepcionAlAnalizarLoginTicketResponse.Message); } return(loginTicketResponse); }