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);
    }
Exemple #2
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 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);
    }