/// <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 argRutaCertX509Firmante, bool argVerbose, StoreName storeName, StoreLocation storeLocation) { 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, storeName, storeLocation); 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); } using (LoginCMSClient client = new LoginCMSClient()) { // AD: para revisar de qué lado esta saliendo el error //client.Endpoint.Behaviors.Add(new SimpleEndpointBehavior()); loginTicketResponse = client.loginCms(cmsFirmadoBase64); client.Close(); } 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); }
public string Obtener(string argServicio, X509Certificate2 certFirmante) { string cmsFirmadoBase64; string loginTicketResponse; // PASO 1: Genero el Login Ticket Request //try { fXmlLoginTicketRequest = new XmlDocument( ); fXmlLoginTicketRequest.LoadXml(XmlStrLoginTicketRequestTemplate); var xmlNodoUniqueId = fXmlLoginTicketRequest.SelectSingleNode("//uniqueId"); var xmlNodoGenerationTime = fXmlLoginTicketRequest.SelectSingleNode("//generationTime"); var xmlNodoExpirationTime = fXmlLoginTicketRequest.SelectSingleNode("//expirationTime"); var xmlNodoService = fXmlLoginTicketRequest.SelectSingleNode("//service"); xmlNodoGenerationTime.InnerText = DateTime.Now.AddMinutes(-10).ToString("s"); xmlNodoExpirationTime.InnerText = DateTime.Now.AddHours(+24).ToString("s"); xmlNodoUniqueId.InnerText = Convert.ToString(Environment.TickCount); xmlNodoService.InnerText = argServicio; Service = argServicio; } //catch { // throw new Exception( "Servicio WSAA: Error al obtener ticket de autenticación. Motivo: Xml de solicitud no válido" ); } // PASO 2: Firmo el Login Ticket Request try { // Convierto el login ticket request a bytes, para firmar var msgBytes = Encoding.UTF8.GetBytes(fXmlLoginTicketRequest.OuterXml); // Firmo el msg y paso a Base64 var encodedSignedCms = CertificadosX509Lib.FirmarBytesMensaje(msgBytes, certFirmante); cmsFirmadoBase64 = Convert.ToBase64String(encodedSignedCms); } catch { throw new Exception("Servicio WSAA: Error al obtener ticket de autenticación. Motivo: Error al firmar el mensaje con el certificado"); } // PASO 3: Invoco al WSAA para obtener el Login Ticket Response try { var servicioWsaa = new LoginCMSClient( ); loginTicketResponse = servicioWsaa.loginCms(cmsFirmadoBase64); } catch (Exception exc) { throw new Exception("Servicio WSAA: Error al obtener ticket de autenticación. Motivo: " + exc.Message); } // PASO 4: Analizo el Login Ticket Response recibido del WSAA //try { fXmlLoginTicketResponse = new XmlDocument( ); fXmlLoginTicketResponse.LoadXml(loginTicketResponse); UniqueID = long.Parse(fXmlLoginTicketResponse.SelectSingleNode("//uniqueId").InnerText); GenerationTime = DateTime.Parse(fXmlLoginTicketResponse.SelectSingleNode("//generationTime").InnerText); ExpirationTime = DateTime.Parse(fXmlLoginTicketResponse.SelectSingleNode("//expirationTime").InnerText); Sign = fXmlLoginTicketResponse.SelectSingleNode("//sign").InnerText; Token = fXmlLoginTicketResponse.SelectSingleNode("//token").InnerText; } //catch { // throw new Exception( "Servicio WSAA: Error al obtener ticket de autenticación. Motivo: Xml de respuesta no válido" ); } return(loginTicketResponse); }