Estás viendo una versión antigua de esta página. Ve a la versión actual.

Comparar con el actual Ver el historial de la página

« Anterior Versión 4 Siguiente »

Contenido


Resumen
  • Versión: v01r05
  • Fecha publicación:  
  • Entrada en vigor desde: 

Cumplimiento normativo

Las normas expuestas son de obligado cumplimiento. La STIC podrá estudiar los casos excepcionales los cuales serán gestionados a través de los responsables del proyecto correspondiente y autorizados por el Área de Gobernanza de la STIC. Asimismo cualquier aspecto no recogido en estas normas deberá regirse en primera instancia por las guías técnicas correspondientes al esquema nacional de seguridad y esquema nacional de interoperabilidad según correspondencia y en su defecto a los marcos normativos y de desarrollo software establecidos por la Junta de Andalucía, debiendo ser puesto de manifiesto ante la STIC.

La STIC se reserva el derecho a la modificación de la norma sin previo aviso, tras lo cual, notificará del cambio a los actores implicados para su adopción inmediata según la planificación de cada proyecto.

En el caso de que algún actor considere conveniente y/o necesario el incumplimiento de alguna de las normas y/o recomendaciones, deberá aportar previamente la correspondiente justificación fehaciente documentada de la solución alternativa propuesta, así como toda aquella documentación que le sea requerida por la STIC para proceder a su validación técnica.

Contacto Arquitectura: l-arquitectura.stic@juntadeandalucia.es

Histórico de cambios

Los cambios en la normativa vendrán acompañados de un registro de las modificaciones. De este modo se podrá realizar un seguimiento y consultar su evolución. Ordenándose de mas recientes a menos recientes, prestando especial cuidado a las cabezeras de la tablas dónde se indican las fechas de entrada en vigor y versión.

Versiónv01r05Fecha publicación

 

Fecha entrada en vigor

 

Alcance
  • Versión inicial sobre el componente que permite la integración con MACO fácilmente

SAS.MacoApiClient

Navegación rápida INTRODUCCIÓN | DEPENDENCIAS | ERRORES CONOCIDOS | HISTORIAL DE CAMBIOS | INTEGRACIÓN DE LA LIBRERÍA | CONFIGURACIÓN | USO


Introducción

En el presente documento se presenta la librería SAS.MacoApiClient, componente .NET Standar 2.0, para el acceso a datos de Maco.

Esta librería permite el acceso a los datos de Maco utilizando dos implementaciones diferentes: una que utiliza internamente el servicio web de Maco y otra que utiliza réplica de BBDD.

La versión actual de la librería , en su versión acceso a réplica de BBDD, solo dispone de métodos para acceso a la información de módulos y perfiles.


Dependencias

Nombre del componenteVersiónDescripción
SASUtils.Xml1.0.1Componente .NET común para tratamiento de XML
System.ServiceModel.Duplex4.5.3
System.ServiceModel.Http4.5.3
System.ServiceModel.NetTcp4.5.3
System.ServiceModel.Security4.5.3
SAS.Common.Core1.1.0Componente .NET común con clases e interfaces core de aplicaciones
SAS.Common.Kernel1.1.0Componente .NET común kernel de aplicaciones
SAS.Common.OracleProvider1.3.3Componente .NET común de configuración de proveedor de datos Oracle
EntityFramework6.2.0ORM de Microsoft para .NET
Oracle.ManagedDataAccess19.6.0Proveedor de acceso a datos de Oracle para .NET
Oracle.ManagedDataAccess.EntityFramework19.6.0ORM de Oracle para .NET


Errores conocidos

  • Bug al parsear fecha en formato cadena a un formato DateTime determinado.

    Problema al parsear una fecha en formato cadena, en la que la hora solo contiene un dígito. Corregido desde de la version 2.0.2


Historial de cambios

Histórico de cambios realizados en la librería

  • 2.0.0 - Versión inicial .NET Standard 2.0. Se refactoriza el proyecto a la versión .NET Standard del .NET Framework. Proyecto MacoApiClient

    • src/Api/Boundary

      • IMacoAuthentication: Interfaz del servicio de autenticación de Maco.
           bool ServiceAuthorization(MacoUser macoUser, string requestedService);
           MacoUser LoginAuthentication(string username, string password, string moduleCode = null);
           MacoUser LoginAuthentication(MacoUser macoUser);
        
      • IMacoOperatorManager: Interfaz del servicio de gestión de Operadores Maco. Permite consultar operadores y cambiarles el password
        MacoUser FindOperator(MacoUser petitionerUser, QuerysUserSearchDto querysUserSearchDto);
        PaginationList<MacoUser> FindOperators(MacoUser petitionerUser, QuerysUserSearchDto querysUserSearchDto);
        void ChangeUserPassword(MacoUser user, string password);
        
      • IMacoProfessionalManager: Interfaz del servicio que consulta datos de profesionales
            MacoUser FindProfessional(MacoUser petitionerUser, QuerysUserSearchDto querysUserSearchDto);
            PaginationList<MacoUser> FindProfessionals(MacoUser petitionerUser, QuerysUserSearchDto querysUserSearchDto);
        
      • MacoAuthentication. Servicio que implementa la interfaz IMacoAuthentication
      • MacoOperatorManager. Servicio que implementa la interfaz IMacoOperatorManager
      • MacoProfessionalManager. Servicio que implementa la interfaz IMacoProfessionalManager
    • src/Api/control/messages

      • CambioClaveOperadorMessage: Tipo que encapsula el mensaje Maco de cambio clave de operador y que es enviado al servicio web de Maco. Deriva de MacoMessage y le añade a éste información de la nueva contraseña del operador y del atributo cambio_clave con valor 'S'

      • ConsultarOperadorMessage: Tipo que encapsula el mensaje Maco de consulta operador y que es enviado al servicio web de Maco. Deriva de MacoMessage y le añade a éste información de: Número de resultados por página, número de página, nombre del operador, login, código diraya, número de profesional, número colegiado, tipo profesional etc.

      • ConsultarProfesionalMessage: Tipo que encapsula el mensaje Maco de consulta profesional y que es enviado al servicio web de Maco. Deriva de MacoMessage.

      • MacoMessage: Tipo que encapsula el mensaje Maco que es enviado al servicio web de Maco. Deriva de Message y le añade a éste información para comprobar que el usuario pertenece al módulo destino y que se devuelva los datos del operador registrados en Operador Único.

        [!NOTA] Para más información sobre estos parámetros, consulte la Documentación Técnica del Servicio Web de Maco.

      • MacoVerificationType: Enumerado con el tipo de verificación que se solicita al servicio web de Maco: Ticket, Password o Normal

      • Message: Tipo que encapsula el mensaje Maco que es enviado al servicio web de Maco

      • PreValidarMessage: Tipo que encapsula el mensaje Maco de prevalidar que es enviado al servicio web de Maco. Deriva de MacoMessage y le añade a éste información sobre: login, password, código módulo, unidad y perfil.

      • ValidarCabeceraMessage:Tipo que encapsula el mensaje Maco de validar cabecera que es enviado al servicio web de Maco. Deriva de MacoMessage y le añade a éste información sobre código de entidad destino.

    • src/Api/control/

      • IMacoExceptionManager: Interfaz que permite comprobar si la respuesta del servicio web de Maco contiene un nodo error así como lanzar una excepción de tipo MacoBusinessException
        void ThrowIfErrorIsPresent(XmlDocument response);
        void ThrowException(short errorCode, string errorDescription = "");
        
      • MacoExceptionManager: Clase que implementa la interfaz IMacoExceptionManager
    • src/Api/entity

      • Config
        • IMacoApiConfig: Configuración de la api de Maco en su versión consulta por servicio web. Contiene información de: url del servicio web de Maco, código del módulo, end point del servicio web de Maco
        • MacoApiConfig: Implementación de la interfaz IMacoApiConfig
      • Exception: listado de excepciones soportado por la librería: CouldNotCreateProfessional, CouldNotCreateRole, etc.
      • Rules
        • ModulePerfilValueRuleForQuerysUser: Validación del dto del criterio de búsqueda,QuerysUserSearchDto, a nivel de perfil. Lanza una excepción de tipo MacoFilterLocationException en caso de que el atributo código de Rol, RoleCode, se encuentre vacío.
        • ModuleValueRuleForQuerysUser.Validación del dto del criterio de búsqueda,QuerysUserSearchDto, a nivel de módulo. Lanza una excepción de tipo MacoFilterLocationException en caso de que el atributo código de módulo, ModuleCode, se encuentre vacío.
      • Validation
        • IRule: Interfaz genérica de validación. Indica si una entidad genérica, TEntity, es válida.
          bool IsValid(TEntity entity);
          
        • ValidatorHelper: Clase de soporte para validaciones de entidades. Aplica una lista de reglas IRule a una entidad genérica TEntity.
      • EndPointType: Enumerado que indica el tipo de endpoint: Validación, Operador o Profesional
      • MacoMessageType: Enumerado que indica el tipo de mensaje Maco: ValidarCabecera, ConsultaOperador, Cambioclaveoperador, Prevalidar.
      • PaginationList: Clase soporte para paginación de elementos.
      • QuerysUserSearchDto: Dto en el que se define los criterios de filtros de usuarios
    • src/Ticket

      • Boundary
        • ITicketValidator: Interfaz de validación de Tickets Maco
          TicketValidatorConfig Config { get; set; }
          HashSet<TicketValidation> Validations { get; }
          bool IsTicketValid(string ticket, string ticketSignature = null,   HashSet<string> permissions = null);
          
        • TicketValidator: Implementación de la interfaz ITicketValidator
      • Control
        • ExpiredTicketValidation: Valida la expiración de un ticket.
        • FutureTicketValidation: Validación de un ticket futuro
        • PermissionTicketValidation: Validación de los permisos de un ticket
        • RSACryptoServiceProviderExtensions: Extensión del método RSA de encriptación
        • SignatureTicketValidation: Validación de la firma de un ticket.
        • TicketValidation: Clase abstracta de validación de un ticket.
      • Entity
        • TicketValidationType: Enumerado con los tipos de validación de ticket soportados: Future, Expired, Permission, Signature.
        • TicketValidatorConfig: Configuración de la validación de tickets.
    • src/User

      • Boundary
        • IMacoUserManager: Interfaz para la creación de usuarios Maco, a partir de un XmlNode, XmlDocument o un string que contiene la respuesta xml del servicio web de Maco.
          MacoUser NewMacoUser(XmlNode oper);
          MacoUser NewMacoUser(XmlDocument doc);     
          PaginationList<MacoUser> ProccessUsersResponse(string xmlResponse, int? pageNumber, int? usersPerPage);
          
        • MacoUserManager: Implementa la interfaz IMacoUserManager.
      • Entity
        • ContactInformation: Entidad en el que se define información de contacto del usuario: emails, faxes, teléfonos móvil, etc
        • MacoAuthority: Entidad con información de autorización de Maco: Código de Rol y Rol.
        • MacoLocation: Entidad con información de localización: código de módulo, código y nombre de unidad
        • MacoUser: Entidad de usuario Maco. Contiene información de: DirayaCode, Login, PasswordMd5, PasswordDate, ModuleCode, etc
        • MacoUserStatus: Enumerado con los tipos de estado en lo que puede estar una entidad de usuario Maco: StatusAny, StatusActive, StatusPasive, StatusLocked, StatusChangePassword.
        • Person: Entidad persona, en la que se define información de: Name, FirstSurname, SecondSurname, IdentifierTypeCode, IdentifierType, IdentifierCode.
        • Professional: Entidad Profesional de tipo Person y en la que se define además: Código de profesional, número de licencia, tipo de profesional y código de especialidad del profesional.
    • src/utils

      • IMacoFactory: Clase utilidad para la creación de diversas entidades Maco, en el caso de no usar inyección de dependencia.
      • MacoUtil: Define diversas utilidades: parsear fecha de cadena a tipo DateTime a partir un array de formatos de fechas determinados, SubstringAfterLast(string ticket, string s): dada una cadena, y una subcadena, obtiene la subcadena existente después de la subcadena pasada por parámetro, etc.
    • src/WebService

      • Boundary
        • IWsMacoActions: Interfaz con las posibles acciones realizadas con el servicio web de Maco
          string PreValidar(Api.Control.Messages.Message message);
          string ValidarCabecera(Api.Control.Messages.Message message);
          string ConsultarOperador(Api.Control.Messages.Message message);
          string CambioClaveOperador(Api.Control.Messages.Message message);
          string ConsultarProfesional(Api.Control.Messages.Message message);
          string ConsultarListaProfesionales(Api.Control.Messages.Message message);
          string ConsultarListaProfesionalesUnidad(Api.Control.Messages.Message message);
          string ConsultarAOProfesionalYModulo(Api.Control.Messages.Message message);
          
        • WsMacoManager: Implementación de la interfaz IWsMacoActions.
      • Control
        • WSOperadorSoap. Clase proxy del servicio web Maco para la gestión de operadores.
        • WSProfesionalSoap. Clase proxy del servicio web Maco para la gestión de profesionales.
        • WSValidacionSoap. Clase proxy del servicio web Maco para las operaciones de validación.
  • 2.0.1 - Actualizar la versión de las librerías utilizadas del namespaces System.ServiceModel a la 4.5.3

  • 2.0.2 - Se sustituye en la definición del formato de fecha 'dd/MM/yyyy HH:mm:ss' , el HH por H, para que se contemple la hora tanto para uno como dos dígitos.

  • 2.1.0 - Se añade implementación por réplica de BBDD para la consulta de módulos y perfil.
    Proyecto MacoApiClient

    • src/Api/Boundary
      • IMacoModuleManager: Se añade servicio de consulta de módulos y perfiles
        MacoLocation GetModuleByCode(IGenericAuthContext<T> context, QuerysUserSearchDto filtro);
        MacoLocation GetRoleModuleByCode(IGenericAuthContext<T> context, QuerysUserSearchDto filtro);
        
      • MacoModuleManager : Implementa la interfaz IMacoModuleManager

    Proyecto SAS.MacoApiClient.Core : Nuevo proyecto añadido a la solución

    • Boundary/Contracts/Repositories
      • IMacoRepository: Se añade interfaz repositorio de acceso a datos de módulos y roles de Maco utilizando réplicas de BBDD Oracle. Obtener módulo por código
        Modulo GetModuleByCode(QueryCriteriaModule filtro);
        
        Obtener perfil a través del código del módulo
        ModuloPerfil GetRoleModuleByCode(QueryCriteriaModule filtro);
        
    • Boundary/Entity/
      • Criteria/QueryCriteriaModule: Criterios de filtros para la entidad módulo y perfil
      • Modulo: Entidad módulo
      • ModuloPerfil: Entidad módulo/perfil

    Proyecto SAS.MacoApiClient.ManagedDataAccess.Oracle : Nuevo proyecto añadido a la solución. Acceso a datos de Maco utilizando réplica de BBDD Oracle

    • Boundary/
      • MacoContextConnection: Clase de configuración del contexto para la conexión con la BBDD. Implementa la interfaz IConfigContextApiConnection. SchemaMacoType es un tipo enumerado en el que se ha definido el tipo de los diferentes esquemas contemplados: Especializada, Bdu o Maco
      • MacoRepository: Clase que implementa la interfaz IMacoRepository. Es la que se comunica con la BBDD
    • Entity
      • EntityFramework: Contiene las diferentes entidades de Entity Framework de la BBDD
      • MacoConexion: Conexión no manejado del contexto Maco
      • SchemaMacoType: tipos de esquemas de BBDD: Especializada, Bdu, Maco. En este caso el esquema utilizado es Maco.

    [!NOTA] >Todo sistema que utilice el modo réplica de BBDD tiene que tener acceso a las tablas de Maco siguientes: ModuloEntity y PerfilModuloEntity .

  • 2.2.0 - Se añade posibilidad de contexto no manejado Proyecto SAS.MacoApiClient.ManagedDataAccess.Oracle :

    • Entity
      • MacoConexion: Se modifica para que no utilice configuración por código en la definición del contexto, es decir, utiliza contexto no manejado: su configuración hay que definirla en fichero de configuración.
      • MacoManagedConexion: Conexión manejado del contexto Maco. En la declaración de la clase se define su tipo de configuración. En este caso: [DbConfigurationType(typeof(ConfiguracionOracleProvider))]
  • 2.3.0 - Se añade posibilidad de configurar tipo de contexto utilizado (manejado o no manejado) Proyecto SAS.MacoApiClient.ManagedDataAccess.Oracle :

    • Boundary/
      • MacoContextConnection: Se implementa el nuevo método GetIsManagedContext de la interfaz IConfigContextApiConnection, el cual devuelve si para la configuración del tipo de esquema que se pasa por parámetro se utiliza contexto manejado o no.
        public bool GetIsManagedContext(SchemaMacoType tipo)
        {
            return this.configuracion.FirstOrDefault(d => d.ShemaType == tipo).IsManagedContext;
        }
        
      • MacoRepository: Se modifica el método GetConexion() para que, dependiendo del parámetro IsManagedContext, de la configuración, se devuelva una conexión Maco manejada o no.
  • 2.4.0 - Se añade la versión réplica del método FindOperator Proyecto SAS.MacoApiClient :

    • src/Api/Boundary/
      • MacoOperatorReplicaManager: Implementa el método FindOperator de la interfaz IMacoOperatorManager en su versión réplica de BBDD. Proyecto SAS.MacoApiClient.ManagedDataAccess.Oracle :
    • /Boundary
      • MacoRepository: Se añade método GetOperadorByDirayaCode en el que se obtiene los datos del profesional u operador a traves de su código Diraya. Si devuelve el CNP indica que el usuario que se obtiene es un profesional. En el caso de que el número de profesional devuelto sea null, se está recuperando una persona operador (no profesional).

        public IList GetOperadorByDirayaCode(string dirayaCode)

        [!NOTA] >En esta versión el método GetOperadorByDirayaCode sólo devuelve: Nombre, Apellidos y NumeroProfesional. Está pendiende que el profesional/operador devuelto contenga la misma información que la versión ServicioWeb del método FindOperator.

  • 2.4.1 - Se actualiza la versión del componente SAS.Common.Oracle a v1.3.3, en el que se actualiza los componentes Oracle.ManagedDataAccess y Oracle.ManagedDataAccess.EntityFramework a la versión 19.6.0

  • 2.4.2 - Se actualiza la versión del componente SAS.Common.Kernel a v1.1.0

  • 2.4.3 - Se añade modo de Seguridad Básica para la comunicación HTTPS de los servicios web de Maco Debido a que el protocolo de comunicación HTTP de los servicios web de maco han cambiado a HTTPS, se ha añadido la posibilidad de comunicación de transporte con cliente anónimo. Los cambios han sido los siguientes

    • MacoApiClient/src/WebService/Boundary
      • WsMacoManager
        private static readonly BasicHttpBinding Binding = new BasicHttpBinding
      {
          MaxReceivedMessageSize = 2147483647,
          MaxBufferSize = 2147483647
      };
      
      Se añade un objeto de tipo BasicHttpsBinding, el cual utiliza modo de seguridad básico de Transporte
       private static readonly BasicHttpsBinding HttpsBinding = new BasicHttpsBinding
      {
          MaxReceivedMessageSize = 2147483647,
          MaxBufferSize = 2147483647
      };
      
      Se crea el método GetBinding, el cual devuelve el objeto HttpsBinding o Binding, según se esté utilizando comunicación HTTPS o no.
       /// <summary>
      /// Obtiene un objeto BasicHttpBinding o BasicHttpsBinding
      /// </summary>
      /// <param name="endpoint"></param>
      /// <returns></returns>
      private HttpBindingBase GetBinding(EndpointAddress endpoint)
      {
          if (endpoint.Uri.Scheme.ToLower() == "https")
          {
              return HttpsBinding;
          }            
          return Binding;
      }
      
      Por último, a la hora de crear la clase proxy, el objeto de tipo Binding que se pasa es el que devuelve el método GetBinding.
        using (var proxy = new GenericProxy<WSValidacionSoap>(GetBinding(Endpoint), Endpoint))
          {
          ...
          }
      


Integración de la librería

Acceder a nuget e instalar la librería SAS.MacoApiClient.


Configuración

La configuración de la api depende del tipo de implementación que se vaya a utilizar, según se acceda a los datos mediante el Servicio Web de Maco o mediante réplicas. Veamos cada una de ellas:

La siguiente configuración se añadiría en el método InitializeContainer() de la clase Startup del proyecto MVC.

Configuración de la API versión Servicio Web En el fichero appsettings se definen secciones en las que se establece configuración de Maco y servicio web de Maco

(1)  "MacoApiClient": {
    "XmlKey": "<RSAKeyValue><Modulus>pJbz24aBed556dtzQGn7Dn+NmaaEWONSg82HQLn3T2x0DkTQEuU40Shr5jcLTyvwxRxA0HG7NlYE7JEPLoUCKIpdBh5sRonn4ZGgF7jYIhWaHqT4sB7+oCVazdKe5c1EmBwS9c0JJPiU4mPSeVEY4NbRduxakMHp/jjMJe25OamWex8cn3ktEPbe15OWCN9hoTnK/anGQmXkzWL/YDNI7WwXIpCI2hxEt3l0AhkgZecOwTYn08wj7YTei8I15pXYiV1nNuxB5AuZrTVxFIwXYHOonblWoubJa68dAkCr5leNfuIa/JzyBAsHMnXU4aLOlrJgQx5yRdd7n0g1YMF9uw==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>",
    "Module": "MODULOMACO"
      },
(2)  "WebServiceLocator": {
    "ServiceAddressMaco": "http://WEBSERVICEMACO/",
    },

(1) Configuración de la clave pública de Maco , XmlKey, y código del módulo Maco, "MODULOMACO" (2) Configuración de la dirección url del servicio web de Maco, "WEBSERVICEMACO"

        (3) var ticketValidatorConfig = new TicketValidatorConfig
            {   
                RsaKey = ConfigurationManager.AppSettings["MacoApiClient:XmlKey"],
                ReferenceDate = DateTime.Now,
                FutureTicketToleranceMillis = -1,
                TicketTtlMillis = 24 * 60 * 60 * 1000,
                TicketValidations = new HashSet<TicketValidationType>()
            };
            // SignatureTicketValidation: Valida que la firma es correcta 
            ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Signature); 
            // ExpiredTicketValidation: Valida que el ticket no este caducado 
            ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Expired); 
            // FutureTicketValidation: Valida que el ticket no sea futuro 
            ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Future);
            // PermissionTicketValidation: Valida que el permiso requerido se encuentre en el ticket 
            ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Permission); 
        (4)     ContainerDI.Register<ITicketValidator>(() => new TicketValidator(ticketValidatorConfig), ContainerDI.LifeStyleContainer.Transient);
        (5) ContainerDI.Register<IMacoExceptionManager, MacoExceptionManager>(ContainerDI.LifeStyleContainer.Transient);
        (6) ContainerDI.Register<IMacoUserManager, MacoUserManager>(ContainerDI.LifeStyleContainer.Transient);
        (7)  var macoApiConfig = new MacoApiConfig(this.Configuration.GetSection("WebServiceLocator:ServiceAddressMaco").Value)
            {
                ModuleCode = this.Configuration.GetSection("MacoApiClient:Module").Value
            };
        (8) ContainerDI.Register<IMacoApiConfig>(() => macoApiConfig, ContainerDI.LifeStyleContainer.Transient);
        (9) ContainerDI.Register<IWsMacoActions>(() => new WsMacoManager(macoApiConfig), ContainerDI.LifeStyleContainer.Transient);
        (10) ContainerDI.Register<IMacoAuthentication, MacoAuthentication>(ContainerDI.LifeStyleContainer.Transient);

(3) Configuración de la validación del ticket de Maco (4) Registro del tipo TicketValidator que implementa la interfaz ITicketValidator (5) Registro del tipo MacoExceptionManager que implementa la interfaz IMacoExceptionManager (6) Registro del tipo MacoUserManager que implementa la interfaz IMacoUserManager (7) Configuración de la api de Maco, en la que se le pasa la dirección del servicio web de Maco y el código del módulo (8) Registro del tipo MacoApiConfig que implementa la interfaz IMacoApiConfig (9) Registro del servicio WsMacoManager que implementa la interfaz IWsMacoActions (10) Registro del servicio MacoAuthentication que implementa la interfaz IMacoAuthentication

Configuración de la API versión Réplica de BBDD

    (11) ContainerDI.Register<IConfigContextApiConnection<SchemaMacoType>>(() =>
            new MacoContextConnection(
              new ManagedConfigConnectionBase<SchemaMacoType>[]
              {
                    new ManagedConfigConnectionBase<SchemaMacoType>(ConfigurationManager.ConnectionStrings["MACOConnection"].ConnectionString, SchemaMacoType.Maco, "REP_PRO_MACO")
              })
            , ContainerDI.LifeStyleContainer.Transient);
    (12) ContainerDI.Register<IMacoRepository, MacoRepository>(ContainerDI.LifeStyleContainer.Transient);
    (13) ContainerDI.Register<IMacoModuleManager<object>, MacoModuleManager>(ContainerDI.LifeStyleContainer.Transient); 

(11) Registro del servicio IConfigContextApiConnection, configuración del contexto de BBDD con el tipo concreto MacoContextConnection. Recibe como parámetros la cadena de conexión de la réplica, tipo de esquema Maco y nombre del esquema de la BBDD. (12) Registro del tipo MacoRepository que implementa la interfaz IMacoRepository (13) Registro del tipo MacoModuleManager que implementa la interfaz IMacoModuleManager


Uso

A continuación se describe el uso de la librería.

Funcionalidades utilizando Servicio Web de Maco Autenticación Para poder realizar la autenticación y autorización con Maco se deberá de hacer uso de la clase MacoAuthentication, mediante el uso del método .loginAuthentication() que devuelve un objeto MacoUser, y con el que se podrá realizar la autenticación con Maco. Si la autenticación no se ha podido realizar con existo se lanzara una excepción de tipo MacoException.

Ejemplo:

  public MacoUser login(string username, string password) {
        return _macoAuthentication.LoginAuthentication(username, password);
    }

Para realizar la comprobación de autorización de un módulo concreto con Maco se deberá de hacer uso del método .ServiceAuthorization(). Si la autorización no se ha podido realizar con éxito se lanzará una excepción de tipo MacoException.

Ejemplo:

  public boolean autorizarServicio(MacoUser user, string requestedService) {
        return _macoAuthentication.ServiceAuthorization(user, requestedService);
    }

Operadores Para poder buscar operadores en Maco se deberá de hacer uso de la función FindOperator, para un solo resultado, o FindOperators, para múltiples resultados. Los campos que pueden ser usados en el dto para la búsqueda son:

UsersPerPage: Número de usuarios por página PageNumber: Numero de la página a recibir Name: Nombre a buscar (puede ser parcial) FirstSurname: Apellido 1 (puede ser parcial) SecondSurname: Apellido 2 (Puede ser parcial) Login: login del usuario DirayaCode: código de diraya ModuleCode: código del módulo UnitCode: código de la unidad organizativa UnitTypeCode: tipo de unidad organizativa

Ejemplo:

  public MacoUser BuscarUsuarioPorLogin(string login) {
       QuerysUserSearchDto querysUserSearchDto= new QuerysUserSearchDto();
       querysUserSearchDto.PageNumber= 1;
       querysUserSearchDto.UsersPerPage = 1;
       querysUserSearchDto.Login = login;
       return _macoOperatorManager.FindOperator(usuarioMacoQueRealizaLaPeticion, querysUserSearchDto);
    }
    //Permite la búsqueda por nombre, devuelve una lista de usuarios
    public PaginationList<MacoUser> BuscarUsuariosPorNombre(string name) {
       QuerysUserSearchDto querysUserSearchDto= new QuerysUserSearchDto();
        querysUserSearchDto.PageNumber = 1;
        querysUserSearchDto.UsersPerPage = 10;
        querysUserSearchDto.Name = name;
        return _macoOperatorManager.FindOperators(usuarioMacoQueRealizaLaPeticion, querysUserSearchDto); 
    }

Para realizar un cambio de contraseña de un usuario en Maco, se deberá de hacer uso de la función ChangeUserPassword:

    //realiza un cambio de contraseña
    public MacoUser CambiarContraseña(MacoUser user, string password) {
        //la manera de generar una contraseña que acepte MACO puede variar y debe de ser consultada en la documentación de MACO.
        return _macoOperatorManager.ChangeUserPassword(user, password);
    }

siendo _macoOperatorManager un objeto de tipo IMacoOperatorManager.

Profesionales

Para poder buscar profesionales en Maco se deberá de hacer uso de la función FindProfessional, para un solo resultado, o FindProfessionals ,para múltiples resultados, de la misma manera que se realiza con los Operadores. Los campos que, adicionalmente a los descritos en Operador, podrán ser usados son los siguientes:

ProfessionalCode: Código de profesional. LicenseNumber: Código de Colegiado. ProfessionalType : Tipo de profesional. ProfessionalSpecialtyCode : Código de la especialidad del profesional. StatusCode: Estado del usuario, cuyos posibles valores son:StatusAny, StatusActive, StatusPassive, StatusLocked, StatusChangePassword.

Validación de tickets Maco El siguiente método permite obtener ticket y firma, pasando al servicio web de Maco: login,password y código módulo Maco

    public void ObtenerTicketFirma(string login, string pass, string modulo, ref string ticket, ref string firma)
        {
            string sResp = null;
            string sMensaje = @"<diraya_solicitud><cabecera_msj fecha='" + DateTime.Now.ToString("dd/MM/yyyy") + "' hora='" + DateTime.Now.ToString("HH:mm") + "' version='4.5' /><contenido_msj><Operador><validar_operador><operador login='" + login + "' pwd='" + pass + "' devolver_datos='S'><localizacion><modulo codigo='" + modulo + "' /></localizacion></operador></validar_operador></Operador></contenido_msj></diraya_solicitud>";

            WSValidacion serMACO = new WSValidacion();
            serMACO.Url = "UrlServicioWebMaco";
            sResp = serMACO.PreValidar(sMensaje);

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(sResp);

            ticket = xml.SelectSingleNode("//accesos").InnerText;
            firma = xml.SelectSingleNode("//accesos/@firma").InnerText;
        }

Si se quiere validar un ticket + permisos concretos, se realizará pasándole la lista de permisos a validar en la llamada IsTicketValid. Por ejemplo:

    List<string> permissions = new List<string>() { "CUSTOMPERMISSION", "CUSTOMPERMISSION2" };
    HashSet<string> hSetPermissions = new HashSet<string>(permissions);
	return new _ticketValidator.IsTicketValid(ticket,null, hSetPermissions)

Si solo se quiere validar los valores por defecto, registrados por inyección de dependencia en la configuración TicketValidatorConfig, no será necesario pasarle la lista de permisos:

   private bool Validate(string ticket, string signature) {
		return new _ticketValidator.IsTicketValid(ticket, signature);
	} 

Siendo _ticketValidator un objeto de tipo ITicketValidator.

Llamada Https a los servicios web de Maco

En la versión 2.4.3 se ha añadido la posibilidad de llamar a las nuevas direcciones HTTPS del servicio Web de Maco.

  • PRE: https://servicios.pre.sas.junta-andalucia.es/maco/
  • PRO: https://servicios.sas.junta-andalucia.es/maco/ Para ello, definimos en el fichero de configuración de la aplicación, la dirección web y los endpoints de Validación, Operador y Profesional. En el caso de PRE, para una aplicación .NET Core añadiríamos al fichero de configuración appsettings.json:
"WebServiceLocator": {
    "ServiceAddressMaco": "https://servicios.pre.sas.junta-andalucia.es/maco/",
    "EndPointAddressMacoValidacion": "/wsValidacion.asmx",
    "EndPointAddressMacoOperador": "/wsOperador.asmx",
    "EndPointAddressMacoProfesional": "/wsProfesional.asmx"
  }

A continuación, definimos un objeto de tipo MacoApiConfig, al que se le añade: la dirección HTTPS del servicio web de MACO (PRE o PRO), el módulo y los endpoints.

    var macoApiConfig = new MacoApiConfig(Configuration.GetSection("WebServiceLocator:ServiceAddressMaco").Value)
            {
                ModuleCode = Configuration.GetSection("MacoApiClient:MacoModule").Value
            };
    macoApiConfig.EndPoints = new Dictionary<MacoApiClient.Api.Entity.EndPointType, string>
            {
               { MacoApiClient.Api.Entity.EndPointType.Validacion, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoValidacion").Value },
               { MacoApiClient.Api.Entity.EndPointType.Operador, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoOperador").Value},
               { MacoApiClient.Api.Entity.EndPointType.Profesional, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoProfesional").Value }              
           };

[!NOTA] >En las versiones <= 2.4.2 no era necesario definir los endpoints de maco, la librería MacoApiClient lo añadía por defecto (/wsCentralizada/wsValidacion.asmx)

Se recomienda utilizar la versión 2.4.3, para que se utilice la comunicación HTTPS con los servicios web de Maco.

Introducción 

En el presente documento se presenta la librería SAS.MacoApiClient, componente .NET Standar 2.0, para el acceso a datos de Maco.

Esta librería permite el acceso a los datos de Maco utilizando dos implementaciones diferentes: una que utiliza internamente el servicio web de Maco y otra que utiliza réplica de BBDD.

La versión actual de la librería , en su versión acceso a réplica de BBDD, solo dispone de métodos para acceso a la información de módulos y perfiles. 


De cara a priorizar futuras funcionalidades, si algún proveedor tiene la necesidad de alguna funcionalidad adicional se deberá de comunicar a l-arquitectura.stic.sspa@juntadeandalucia.es

Dependencias


Historial de Cambios

v1.7.1.1

  • Corregido bug en el TicketValidator, concretamente en la validacion de ticket expirados

v1.7.0.1

  • Modificacion para permitir llamadas a algunos servicios solo con ticket y firma

v1.6.0.1

  • Extendido metodo en la api de validacion de tickets, parametro adicional a la llamada isTicketValid, para poder indicarle Permisos adicionales en esa validacion.

v1.5.0.1

  • Extendido metodo en la api de Autentificacion, ahora permite opcionalmente especificar directamente el codigo de modulo, para que use temporalmente ese modulo en vez del configurado en MacoApiConfig
  • A partir de esta version el ModuleCode del usuario que se use para atentificar, se mantendra estatico. Anteriormente al ralizar el login, se establecia el ModuleCode especificado en el MacoApiConfig.

v1.3.1.1

  • Perfectivo en el webService de PreValidar, reduciendo el tamaño del xml generado y enviado

v1.3.0.1

  • Refactorizacion del codigo
    • Nuevos test unitarios
    • Factoria nueva para crear todos los recursos encesarios

v1.2.1.1

  • Corregido bug en la busqueda de operadores que impedia hacer uso de la busqueda en test unitarios

v1.2.0.1

  • Añadido MacoProfessionalManager para la gestión de operaciones referentes a los profesionales
  • Refactorizado el nombre de los métodos de MacoOperatorManager. Todas las referencias de `User' han sido sustituidas por `Operator'.
  • Refactorizado los parámetros de entrada para los métodos `findOperator/s)' de la clase MacoOperatorManager, ahora aceptan un objeto dto con los parámetros que configuran la búsqueda.
  • Modificada la forma en que el validador de expiración de ticket funcionaba (ExpiredTicketValidation), para que por defecto use la fecha actual como referencia a la hora de validar los tickets, si no se le especifica ninguna en la configuración.

3. Integración de la librería

Para incluir la librería en un proyecto .NET es necesario realizar los siguientes pasos:

  1. Agregar el repositorio Nuget de la Junta de Andalucía.
  2. Especificar la dependencia en el packages.config o archivos similar de dependencias

    • es.ja.csalud.sas.componentescomunes.MacoApiClient

Datos técnicos de la librería:



.Net Framework 4.5.2

Puede ser usada de forma tradicional creando los objetos requeridos por cada constructor. O haciendo uso de la "MacoFactory" para facilitar la creacion de los objetos.

Actualmente existen dos objetos de configuración:

  • MacoApiConfig gestiona la configuración general de la librería. Ejemplo:
  • TicketValidatorConfig gestiona la configuración para la validación de tickets. Ejemplo:

        
    ...
       MacoApiConfig macoApiConfig = new MacoApiConfig("http://ws-maco-pre.diraya-test.sspa.junta-andalucia.es/");
       macoApiConfig.ModuleCode="338";
    ...
       TicketValidatorConfig ticketConfig = new TicketValidatorConfig();
       ticketConfig.RSAkey=xmlKey;
       ticketConfig.ReferenceDate = null;
       ticketConfig.FutureTicketToleranceMillis=-1;
       ticketConfig.TicketTtlMillis=24 * 60 * 60 * 1000;
       ticketConfig.TicketValidations= new HashSet<TicketValidationType>(TicketValidationType.SIGNATURE, TicketValidationType.EXPIRED));
    ...
       MacoFactory factory = new MacoFactory(macoApiConfig,ticketConfig);
    
    ...

    Estos objetos serán usados por defecto en todas los objetos contruidos por la factoria. 


Autenticación

Para poder realizar la autenticación y autorización con Maco se deberá de hacer uso de la clase MacoAuthentication

Mediante el uso del método .LoginAuthentication() que devuelve un objeto MacoUser, se podrá realizar la autenticación con Maco.

Si la autenticación no se ha podido realizar con existo se lanzara una excepción de tipo MacoException.

Ejemplo:

...
    MacoAuthentication macoAuthentication;

    public MacoUser Login(String username, String password) {
        return macoAuthentication.LoginAuthentication(username, password);
    }
...


Para realizar la comprobación de autorización de un módulo concreto con Maco se deberá de hacer uso del método .ServiceAuthorization().

Si la autorización no se ha podido realizar con existo se lanzara una excepción de tipo MacoException.

Ejemplo:

...
    MacoAuthentication macoAuthentication;

    public boolean AutorizarServicio(MacoUser user, String requestedService) {
        return macoAuthentication.ServiceAuthorization(user, requestedService);
    }
...

Operadores

Para poder buscar operadores en maco se deberá de hacer uso de la función FindOperator (para un solo resultado) o FindOperators (para múltiples resultados). Los campos que pueden ser usados en el dto para la búsqueda son:

  • usersPerPage: Número de usuarios por página
  • pageNumber: Numero de la página a recibir
  • name: Nombre a buscar (puede ser parcial)
  • firstSurname: Apellido 1(Puede ser parcial)
  • secondSurname: Apellido 2(Puede ser parcial)
  • login: login del usuario
  • dirayaCode: código de diraya
  • moduleCode: código del módulo
  • unitCode: código de la unidad organizativa
  • unitTypeCode: tipo de unidad organizativa

Ejemplo:

...
    MacoOperatorManager macoOperatorManager;

    //busca un usuario por su login
    public MacoUser BuscarUsuarioPorLogin(String login) {
       QuerysUserSearchDto querysUserSearchDto= new QuerysUserSearchDto();
       querysUserSearchDto.PageNumber=1;
       querysUserSearchDto.UsersPerPage=1;
       querysUserSearchDto.Login(login;
       return macoOperatorManager.FindOperator(usuarioQueRealizaLaPeticion, querysUserSearchDto);
    }
    //Permite la búsqueda por nombre, devuelve una lista de usuarios
    public List<MacoUser> BuscarUsuariosPorNombre(String name) {
       QuerysUserSearchDto querysUserSearchDto= new QuerysUserSearchDto();
       querysUserSearchDto.PageNumber=1;
       querysUserSearchDto.UsersPerPage=1;
       querysUserSearchDto.Name=name;
       return macoOperatorManager.FindOperators(usuarioQueRealizaLaPeticion, querysUserSearchDto); // se recomienda el uso de la version paginada de este método.
    }
...

Para realizar un cambio de contraseña de un usuario en maco se deberá de hacer uso de la función ChangeUserPassword

...
    MacoOperatorManager macoOperatorManager;

    //realiza un cambio de contraseña
    public MacoUser CambiarContraseña(MacoUser user, String password) {
        String hashpass= MacoUtil.Md5(password); //la manera de generar una contraseña que acepte MACO puede variar y debe de ser consultada en la documentación de MACO.
        return macoOperatorManager.ChangeUserPassword(user, hashpass);
    }
...

Profesionales

Para poder buscar profesionales en maco se deberá de hacer uso de la función FindProfessional (para un solo resultado) o FindProfessionals (para múltiples resultados) de la misma manera que se realiza con los Operadores. Los campos que adicionalmente a los descritos en Operador que podrán ser usados son los siguientes:

  • professionalCode: Código de profesional.
  • licenseNumber: Código de Colegiado.
  • professionalType: Tipo de profesional.
  • professionalSpecialtyCode: Código de la especialidad del profesional.
  • statusCode: Estado del usuario, solo acepta 0 o 1 (STATUS_ACTIVE(0L), STATUS_PASSIVE(1L))

Utilidades

Validacion de tickets de Maco:

Si no se especificó en la configuracion una fecha de referencia  se usara por defecto la fecha del sistema.

  • ExpiredTicketValidation: Valida que el ticket no este caducado
    • Se configurara este parametro: ticketValidatorConfig.TicketTtlMillis
  • FutureTicketValidation: Valida que el ticket no sea futuro
    • Se configurara este parametro: ticketValidatorConfig.FutureTicketToleranceMillis
  • PermissionTicketValidation: Valida que el permiso requerido se encuentre en el ticket
    • Se configurara este parametro:ticketValidatorConfig.Permissions
  • SignatureTicketValidation: Valida que la firma es correcta
    • Se configurara este parametro: ticketValidatorConfig.RSAkey

Si se quiere validar un ticket + permisos concretos se realizará pasandole la lista de permisos a validar en la llamada IsTicketValid. Por ejemplo:

...
	return ticketValidator.IsTicketValid(ticket, permissions)
...
  • Sin etiquetas