Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        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);
        }