Tema anterior: Programación del adaptadorTema siguiente: Caso práctico 22: Generación de informes mediante PERL


Caso práctico 21: Ejemplo de integración de LDAP

Requisitos de la organización

Use los valores definidos por el usuario que ya están presentes en el servidor LDAP de la organización. Además, el portal de la organización se usa para el inicio de sesión y acceso de CA Business Service Insight mediante las capacidades de inicio de sesión silencioso de CA Business Service Insight para los portales de inició único de sesión (SSO).

Defina un script de traducción de Visual Basic (VB) para la creación automática de usuarios en el sistema de CA Business Service Insight (sincronización de LDAP). El script de traducción se utiliza para conectarse al servidor LDAP de la organización y extraer la lista de usuarios de allí. Los métodos de paquetes de herramientas de CA Business Service Insight se utilizan para la creación de usuarios, grupos y roles.

Ejemplo de código de VB de conexión de LDAP

Option Explicit On
Imports System.DirectoryServices
    Public Function GetLDAPUsers(ByVal ldapServerName As String, ByVal pFindWhat As String) As ArrayList
        Dim oSearcher As New DirectorySearcher
        Dim oResults As SearchResultCollection
        Dim oResult As SearchResult
        Dim RetArray As New ArrayList
        Dim mCount As Integer
        Dim mIdx As Integer
        Dim mLDAPRecord As String
        Dim ResultFields() As String = {"securityEquals", "cn"}
        Try
            With oSearcher
                .SearchRoot = New DirectoryEntry("LDAP://" & ldapServerName & _
          "/dc=lippogeneral,dc=com")
                .PropertiesToLoad.AddRange(ResultFields)
                .Filter = "cn=" & pFindWhat & "*"
                oResults = .FindAll()
            End With
            mCount = oResults.Count
            If mCount > 0 Then
                For Each oResult In oResults
                    mLDAPRecord = oResult.GetDirectoryEntry().Properties("cn").Value & "  " & oResult.GetDirectoryEntry().Properties("mail").Value
                    RetArray.Add(mLDAPRecord)
                Next
            End If
        Catch e As Exception
            MsgBox("Error is " & e.Message)
            Return RetArray
        End Try

        Return RetArray
    End Function

Sub CheckAddUser
Dim map
Set map = Tools.GetUserDetails("acme@Test")
' Comprobar si ya existe el usuario
' Asignación de Tools.AddUserByMap
' Consultar con el duplicado
map("UserName") = "acme2"
map("UserPassword") = "acme2"
map("UserPasswordExpirationInterval") = "50"
map("UserDescription") = "New description"
map("UserStatus") = "INACTIVE"
Tools.AddUserByMap map
Tools.Commit
End Sub

Métodos de script de traducción de VB de CA Business Service Insight

Cree un código de "inicio de sesión silencioso" e intégrelo en el portal de la organización que se va a usar para el inicio de sesión de CA Business Service Insight.

Ejemplo de código C# de la puerta de enlace de CA Business Service Insight (se integrará en el portal de la organización)

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Security.Cryptography.X509Certificates;
using OblicoreAuthenticationWebService;

namespace Oblicore.SSO
{
      /// <summary>
      /// Esta página de muestra es una puerta de enlace de muestra a la interfaz de la aplicación Oblicore Guarantee(tm)
      /// La página se debería convocar antes de navegar a cualquier página en el sitio web de Oblicore Guarantee 
      /// o cualquier página utilizando los servicios web proporcionados por Oblicore
      /// La página de OblicoreGateway debería realizar las acciones siguientes:
      ///         1) Convocar el servicio web de autenticación de Oblicore para autenticar el usuario actual
      ///         2) Convocar la página SilentLogin.asp en el sitio web de Oblicore para iniciar sesión silenciosamente al sitio web de Oblicore 
      ///            y crear el contexto de sesión de usuario
      ///         3) Redirigir a la página deseada
      /// </summary>
      public partial class _Default : System.Web.UI.Page
      {

            /// <summary>
            /// credenciales de usuario de Oblicore 
            /// </summary>
            struct UserCredentials
            {
                  public string UserName;
                  public string Organization;
            }

            private void Page_Load(object sender, System.EventArgs e)
            {

                  if (Request["OGSESSIONID"]!=null)
                  {
                        //SilentLogin.asp ha vuelto a dirigir a esta página después de la autenticación.
                        //Guardar OGSESSIONID en la cookie para utilizar más adelante
                        HttpCookie SessionCookie = new HttpCookie("OGSESSIONID",Request["OGSESSIONID"]);
                        Response.Cookies.Add(SessionCookie);
                        //Redirigir a la página deseada
                        Response.Redirect("/");
                  }
                  else
                  {
                        //Primera vez que se entra en la página.
                        //Realizar la autenticación.

                        string sAuthToken = string.Empty;

                        // Obtener nombre de usuario de OG y organizaciones del directorio de usuarios del portal 
                        UserCredentials ucOblicoreUser = GetOblicoreUserCredentials();

                        //Inicializar el servicio web de autenticación de Oblicore
                        //El proyecto debería incluir la referencia web al servicio
                        //El servicio está localizado en el sitio web de Oblicore Guarantee en /WebServices/OblicoreAuth.asmx
                        OblicoreAuth oAuthService = new OblicoreAuth();
                     //     oAuthService.ClientCertificates.Add(x509);
                        oAuthService.Url = "https://" + "localhost" + "/WebServices/OblicoreAuth.asmx";
                        try
                        {
                              //Invocar servicio web de autenticación.
                              //El método AuthenticateUser devuelve un token cifrado, que debería pasar a 
                              //la página SilentLogin.asp, situada en la carpeta raíz del sitio web de Oblicore Guarantee  
                              sAuthToken = oAuthService.AuthenticateUser(ucOblicoreUser.UserName,ucOblicoreUser.Organization);
                        }
                        catch (Exception ex)
                        {
                              //Continuar con error de autenticación si los hay
                              Response.Write("The error has occurs during Oblicore authentication: " + ex.Message);
                              Response.End() ;
                        }
                  
                        //Convocar la página Call SilentLogin.asp junto con el pase a la carpeta de la autenticación
                        //La página SilentLogin.asp está situada en la carpeta raíz del sitio web de Oblicore Guarantee 
                        //Después del inicio de sesión, la página SilentLogin.asp volverá a redirigir a la página actual junto con el parámetro OGSESSIONID de pase
                        //Response.Redirect(ConfigurationSettings.AppSettings["OGURL"].ToString() + "/SilentLogin.asp?AuthToken="+Server.UrlEncode(sAuthToken)+"&DesiredPage="+GetCurrentPageURL());
                        Response.Redirect("https://vit-05/SilentLogin.asp?AuthToken=" + Server.UrlEncode(sAuthToken) + "&DesiredPage=/Oblicore.asp"); // + GetCurrentPageURL());
                  }
            }


            /// <summary>
            /// Obtener nombre de usuario y organización de Oblicore Guarantee del directorio de usuarios del portal
            /// El método se supone que convoca ActiveDirectory u otro repositorio mediante el portal de la API
            /// para obtener el nombre de usuario y organización actual en términos de Oblicore Guarantee
            /// </summary>
            /// <returns>estructura de credenciales de usuario de Oblicore Guarantee</returns>
            private UserCredentials GetOblicoreUserCredentials()
            {
                  UserCredentials ucOblicoreUser = new UserCredentials();
                  //actualmente siempre se supone que el usuario es administrador y la organización es Oblicore (valor predeterminado)
                  ucOblicoreUser.UserName = "sadmin";
                  ucOblicoreUser.Organization = "Oblicore";
                  return ucOblicoreUser;
            }



            /// <summary>
            /// Recupera URL de página actual
            /// </summary>
            /// <returns>URL completa de la página actual</returns>
            private string GetCurrentPageURL()
            {
                  string s = (Request.ServerVariables["HTTPS"]==null||Request.ServerVariables["HTTPS"].ToLower()=="off")?"http://":"https://";
                  s += Request.ServerVariables["SERVER_NAME"] + Request.ServerVariables["URL"];
                  if (Request.QueryString.ToString() != string.Empty)
                  {
                        s += "?"+Request.QueryString.ToString();
                  }
                  return s;
            }

            #region, código generado por el diseñador de formularios web
            override protected void OnInit(EventArgs e)
            {
                  //
                  // CODEGEN: el diseñador de formularios web de ASP.NET requiere esta llamada.
                  //
                  InitializeComponent();
                  base.OnInit(e);
            }
            
            /// <summary>
            /// Método obligatorio por motivos de compatibilidad del diseñador; no modificar
            /// el contenido de este método con el editor de código.
            /// </summary>
            private void InitializeComponent()
            {    
                  this.Load += new System.EventHandler(this.Page_Load);
            }
            #endregion
      }
}