Advertencia |
---|
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 |
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.
title | Versiones de la normativa |
---|
Este documento es una guia de desarrollo en continua evolución. Para cualquier duda o sugerencia por favor contante con nosotros. Contacto Arquitectura: l-arquitectura.stic@juntadeandalucia.es |
Expandir | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
En el presente documento se presenta la librería SAS.MacoApiClient, que permite el acceso a datos de Maco.
Dispone de dos versiones, .NET Framework 4.5.2 y .NET Standard 2.0:
La versión actual de la librería .NET Standard , 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.
Se recomienda la instalación de la versión de la librería .NET Standard 2.0, en su versión Servicio Web, compatible con .NET Framework desde la versión 4.6.1 de .NET Framework. por su actualización más periódica.
Se define las siguientes dependencia de la librería:
Versión API 1.7.6 y Versión API >= 2.0.0
Nombre del componente | Versión | Descripción |
---|---|---|
System.ServiceModel.Duplex | 4.5.3 | Proporciona clases para consumir y comunicarse con servicios en modo Dúplex |
System.ServiceModel.Http | 4.5.3 | Gestiona solicitudes realizadas a través del protocolo HTTP |
System.ServiceModel.NetTcp | 4.5.3 | Genera de forma predeterminada una pila de comunicación en tiempo de ejecución, que utiliza la seguridad de transporte, TCP para la entrega de mensajes |
System.ServiceModel.Security | 4.5.3 | Se encarga de temas generales relacionados con la seguridad |
Versión API >= 2.0.0
Nombre del componente | Versión | Descripción |
---|---|---|
SASUtils.Xml | 1.0.1 | Componente .NET común para tratamiento de XML |
SAS.Common.Core | 1.1.0 | Componente .NET común con clases e interfaces core de aplicaciones |
SAS.Common.Kernel | 1.1.0 | Componente .NET común kernel de aplicaciones |
SAS.Common.OracleProvider | 1.3.3 | Componente .NET común de configuración de proveedor de datos Oracle |
EntityFramework | 6.2.0 | ORM de Microsoft para .NET |
Oracle.ManagedDataAccess | 19.6.0 | Proveedor de acceso a datos de Oracle para .NET |
Oracle.ManagedDataAccess.EntityFramework | 19.6.0 | ORM de Oracle para .NET |
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 en la versión 1.7.3 y desde de la version 2.0.2
Configurar en Visual Studio un nuevo origen de paquetes Nuget ( clic en “Administrar Paquetes Nuget …” del proyecto al que se desea añadir la referencia el componente MacoApiClient) indicando en el campo Origen la dirección de repositorios de componentes .NET del SAS: http://net.lib.repository.alm.sas.junta-andalucia.es/.
Versión API < 2.5.0
Versión API >= 2.5.0
Previo a la configuración de la librería se debe de disponer de los siguientes datos proporcionados por la Oficina Técnica de Interoperabilidad:
El validador de ticket requiere la configuración de los siguientes parámetros:
|
---|
Cómo ejemplo de configuración, la clase UserService provee un servicio de autenticación y autorización contra el servicio de MACO.
En el ejemplo siguiente se utiliza el fichero de configuración app.config para definir los parámetros de configuración de Maco: clave pública de Maco, ruta principal servicio web de Maco y endpoints de Validación, Operador y Profesional de Maco.
Bloque de código | ||||
---|---|---|---|---|
| ||||
<appSettings>
<add key="MacoXmlKey" value="CLAVE_PUBLICA_DE_MACO" />
<add key="MacoModule" value="CODIGO_EN_MACO_DEL_SISTEMA" />
<add key="ServiceAddressMaco" value="https://servicios.pre.sas.junta-andalucia.es/" />
<add key="EndPointAddressMacoValidacion" value="/maco/wsValidacion.asmx" />
<add key="EndPointAddressMacoOperador" value="/maco/wsOperador.asmx" />
<add key="EndPointAddressMacoProfesional" value="/maco/wsProfesional.asmx" />
</appSettings>
|
Se consulta la clave pública de Maco del fichero de configuración
Bloque de código | ||||
---|---|---|---|---|
| ||||
string _xmlMacoKey = ConfigurationManager.AppSettings.Get("MacoXmlKey"); |
Se crea el objeto de configuración de Maco, MacoApiConfig. La url que recibe como parámetro se consultará de fichero de configuración o BBDD. En el ejemplo se ha utilizado la ruta inicial de PRE.
Bloque de código | ||||
---|---|---|---|---|
| ||||
string serviceAddressMaco= ConfigurationManager.AppSettings.Get("ServiceAddressMaco");
MacoApiConfig macoApiConfig = new MacoApiConfig(serviceAddressMaco); |
Se consulta el código de módulo asignado al sistema en Maco.
Bloque de código | ||||
---|---|---|---|---|
| ||||
macoApiConfig.ModuleCode = ConfigurationManager.AppSettings.Get("MacoModule"); |
Se define los enpoints de los diferentes servicios web de Maco en el objeto macoApiConfig: Validación, Operador y Profesionales.
Bloque de código | ||||
---|---|---|---|---|
| ||||
string endPointAddressMacoValidacion = ConfigurationManager.AppSettings.Get("EndPointAddressMacoValidacion");
string endPointAddressMacoOperador = ConfigurationManager.AppSettings.Get("EndPointAddressMacoOperador");
string endPointAddressMacoProfesional = ConfigurationManager.AppSettings.Get("EndPointAddressMacoProfesional");
macoApiConfig.EndPoints = new Dictionary<MacoApiClient.Api.Entity.EndPointType, string>
{
{ MacoApiClient.Api.Entity.EndPointType.Validacion, endPointAddressMacoValidacion },
{ MacoApiClient.Api.Entity.EndPointType.Operador, endPointAddressMacoOperador },
{ MacoApiClient.Api.Entity.EndPointType.Profesional, endPointAddressMacoProfesional }
}; |
Se define la configuración del validador de ticket. En el ejemplo, se comprueba que la fecha del ticket sea de 24 horas máximo y no se permite ticket a futuro (FutureTicketToleranceMillis =0).
Bloque de código | ||||
---|---|---|---|---|
| ||||
TicketValidatorConfig ticketConfig = new TicketValidatorConfig()
{
RsaKey = _xmlMacoKey,
ReferenceDate = DateTime.Now,
FutureTicketToleranceMillis = 0,
TicketTtlMillis = 24 * 60 * 60 * 1000,
TicketValidations = new HashSet<TicketValidationType>()
}; |
Se añaden los diferentes tipos de validaciones. En el ejemplo, validación de firma, expiración de ticket, ticket futuro y permisos.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ticketConfig.TicketValidations.Add(TicketValidationType.Signature); //SignatureTicketValidation: Valida que la firma es correcta
ticketConfig.TicketValidations.Add(TicketValidationType.Expired); //ExpiredTicketValidation: Valida que el ticket no esté caducado
ticketConfig.TicketValidations.Add(TicketValidationType.Future); //FutureTicketValidation: Valida que el ticket no sea futuro
ticketConfig.TicketValidations.Add(TicketValidationType.Permission); //PermissionTicketValidation: Valida que el permiso requerido se encuentre en el ticket |
Se inicializa un objeto de tipo MacoFactory, el cual recibe un objeto configuración de la api y del ticket. Permite crear el resto de objetos necesarios para la utilización de la API.
Bloque de código | ||||
---|---|---|---|---|
| ||||
factory = new MacoFactory(macoApiConfig, ticketConfig); |
Se crea el objeto de autenticación de Maco, el cual permite realizar la autenticación o comprobar la autorización de un módulo concreto de Maco.
Bloque de código | ||||
---|---|---|---|---|
| ||||
macoAuthentication = new MacoAuthentication(factory.MacoUserManager, macoApiConfig, factory.TicketValidator, factory.WsMacoManager, factory.MacoExceptionManager); |
A continuación se presenta el código completo del ejemplo:
Bloque de código | ||||||
---|---|---|---|---|---|---|
| ||||||
public class UserService
{
MacoFactory factory;
MacoAuthentication macoAuthentication;
public UserService()
{
string _xmlMacoKey = "CLAVE_PUBLICA_MACO";
MacoApiConfig macoApiConfig = new MacoApiConfig("https://servicios.pre.sas.junta-andalucia.es/");
macoApiConfig.ModuleCode = "MODULO_MACO_DEL_SISTEMA";
macoApiConfig.EndPoints = new Dictionary<MacoApiClient.Api.Entity.EndPointType, string>
{
{ MacoApiClient.Api.Entity.EndPointType.Validacion, @"/maco/wsValidacion.asmx" },
{ MacoApiClient.Api.Entity.EndPointType.Operador, @"/maco/wsOperador.asmx"},
{ MacoApiClient.Api.Entity.EndPointType.Profesional, @"/maco/wsProfesional.asmx" }
};
TicketValidatorConfig ticketConfig = new TicketValidatorConfig()
{
RsaKey = _xmlMacoKey,
ReferenceDate = DateTime.Now,
FutureTicketToleranceMillis = -1,
TicketTtlMillis = 24 * 60 * 60 * 1000,
TicketValidations = new HashSet<TicketValidationType>()
};
ticketConfig.TicketValidations.Add(TicketValidationType.Signature); //SignatureTicketValidation: Valida que la firma es correcta
ticketConfig.TicketValidations.Add(TicketValidationType.Expired); //ExpiredTicketValidation: Valida que el ticket no este caducado
ticketConfig.TicketValidations.Add(TicketValidationType.Future); //FutureTicketValidation: Valida que el ticket no sea futuro
ticketConfig.TicketValidations.Add(TicketValidationType.Permission); //PermissionTicketValidation: Valida que el permiso requerido se encuentre en el ticket
factory = new MacoFactory(macoApiConfig, ticketConfig);
macoAuthentication = new MacoAuthentication(factory.MacoUserManager, macoApiConfig, factory.TicketValidator, factory.WsMacoManager, factory.MacoExceptionManager);
}
} |
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 de base de datos. Veamos cada una de ellas:
En ambos ejemplos se utiliza como base un proyecto .NET MVC.
Primero, en el fichero Startup.cs, método ConfigureServices, se inicializa el contenedor de inyección de dependencia:
Bloque de código | ||||
---|---|---|---|---|
| ||||
public void ConfigureServices(IServiceCollection services)
{
...
ContainerDI.SetAsyncScopedLifestyle(); // establecer estilo de vida por defecto del contenedor de inyección. Permite procesar tanto operaciones asíncronas como síncronas
ContainerDI.RegisterServices(ref services);
...
}
|
ContainerDI, clase del componente común SAS.Util.Injection, el cual permite el registro por inyección de dependencia de los diferentes servicios y tipos utilizados en el sistema.
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: clave pública de maco y módulo del sistema en Maco, y servicio web de Maco: dirección del servicio web de Maco y los endpoints de Validación, Operador y Profesional
Bloque de código | ||||
---|---|---|---|---|
| ||||
"MacoApiClient": {
"XmlKey": "CLAVEPUBLICAMACO",
"Module": "MODULOMACO"
},
"WebServiceLocator": {
"ServiceAddressMaco": "https://servicios.pre.sas.junta-andalucia.es/",
"EndPointAddressMacoValidacion": "/maco/wsValidacion.asmx",
"EndPointAddressMacoOperador": "/maco/wsOperador.asmx",
"EndPointAddressMacoProfesional": "/maco/wsProfesional.asmx"
},
|
En el fichero Startup.cs, método Configure(IApplicationBuilder app, IHostingEnvironment env), añadir la siguiente configuración de los controladores , viewcomponents de MVC y la llamada al nuevo método InitializeContainer :
Bloque de código | ||||
---|---|---|---|---|
| ||||
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
ContainerDI.RegisterMvcControllers(ref app);
ContainerDI.RegisterMvcViewComponents(ref app);
this.InitializeContainer();
...
} |
A continuación, en el fichero Startup.cs, crear el método void InitializeContainer() y añadir la siguiente configuración para definir la configuración del validador de ticket, configuración con los endpoints de los servicios web de Maco y registrar por inyección de dependencia los diferentes servicios utilizados de la API:
|
---|
Bloque de código | ||
---|---|---|
| ||
services.AddMacoWSServices (macoApiConfig,ticketValidatorConfig ); |
En el se le pasa como argumentos el objeto configuración de la API y la configuración del validador de ticket. Este método se encuentra en el espacio de nombre SAS.MacoApiClient.WebService.IoC.
Configuración de la validación del ticket de Maco. Se define validación de firma, fecha del ticket y permisos
Bloque de código | ||||
---|---|---|---|---|
| ||||
/// <summary>
/// Inicializador de contenedor utilizando el inyector de dependencia ContainerDI.
/// </summary>
private void InitializeContainer()
{
var ticketValidatorConfig = new TicketValidatorConfig
{
RsaKey = ConfigurationManager.AppSettings["MacoApiClient:XmlKey"],
ReferenceDate = DateTime.Now,
FutureTicketToleranceMillis = -1,
TicketTtlMillis = 24 * 60 * 60 * 1000,
TicketValidations = new HashSet<TicketValidationType>()
};
ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Signature); // SignatureTicketValidation: Valida que la firma es correcta
ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Expired); // ExpiredTicketValidation: Valida que el ticket no este caducado
ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Future); // FutureTicketValidation: Valida que el ticket no sea futuro
ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Permission); // PermissionTicketValidation: Valida que el permiso requerido se encuentre en el ticket |
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. También se define los endpoints de los servicios web de Maco.
Bloque de código | ||||
---|---|---|---|---|
| ||||
var macoApiConfig = new MacoApiConfig(this.Configuration.GetSection("WebServiceLocator:ServiceAddressMaco").Value)
{
ModuleCode = this.Configuration.GetSection("MacoApiClient:Module").Value
};
macoApiConfig.EndPoints = new Dictionary<MacoApiClient.WebService.Api.Entity.EndPointType, string>
{
{ MacoApiClient.WebService.Api.Entity.EndPointType.Validacion, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoValidacion").Value },
{ MacoApiClient.WebService.Api.Entity.EndPointType.Operador, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoOperador").Value},
{ MacoApiClient.WebService.Api.Entity.EndPointType.Profesional, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoProfesional").Value }
}; |
|
---|
Registro del tipo TicketValidator que implementa la interfaz ITicketValidator. Se encarga de gestionar la validación de tickets.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<ITicketValidator>(() => new TicketValidator(ticketValidatorConfig), ContainerDI.LifeStyleContainer.Transient); |
Registro del tipo MacoExceptionManager que implementa la interfaz IMacoExceptionManager. Se encarga de gestionar las excepciones y errores informados del servicio web de Maco.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IMacoExceptionManager, MacoExceptionManager>(ContainerDI.LifeStyleContainer.Transient); |
Registro del tipo MacoUserTransformer que implementa la interfaz IMacoUserTransformer. Se encarga de transformar los mensajes XML recibidos del servicio web de MACO a objetos.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IMacoUserTransformer, WSMacoUserTransformer>(ContainerDI.LifeStyleContainer.Transient); |
|
---|
Registro del tipo MacoApiConfig que implementa la interfaz IMacoApiConfig. Contiene la información de configuración de la API.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IMacoApiConfig>(() => macoApiConfig, ContainerDI.LifeStyleContainer.Transient); |
Registro del tipo WsMacoManager que implementa la interfaz IWsMacoActions. Es la clase wrapper encargada de llamar a los servicios web de Maco.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IWsMacoActions>(() => new WsMacoManager(macoApiConfig), ContainerDI.LifeStyleContainer.Transient); |
Registro del servicio WSMacoAuthentication que implementa la interfaz IMacoAuthentication. Encargada de gestionar las consultas al servicio de Autenticación de Maco
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IMacoAuthentication, WSMacoAuthentication>(ContainerDI.LifeStyleContainer.Transient); |
|
---|
Registro del servicio WSMacoProfessionalManager que implementa la interfaz IMacoProfessionalManager. Encargada de gestionar las consultas al servicio Profesional de Maco.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IMacoProfessionalManager, WSMacoProfessionalManager>(ContainerDI.LifeStyleContainer.Transient); |
Registro del servicio WSMacoOperatorManager que implementa la interfaz IMacoOperatorManager. Encargada de gestionar las consultas al servicio Operador de Maco
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IMacoOperatorManager, WSMacoOperatorManager>(ContainerDI.LifeStyleContainer.Transient) |
Configuración de la API versión Réplica de BBDD
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, en este caso del fichero de configuración app.config, tipo de esquema Maco y nombre del esquema de la BBDD.
Bloque de código | ||||
---|---|---|---|---|
| ||||
var macoContextConnection = new MacoContextConnection( new ManagedConfigConnectionBase<SchemaMacoType>[] { new ManagedConfigConnectionBase<SchemaMacoType>(ConfigurationManager.ConnectionStrings["MACOConnection"].ConnectionString, SchemaMacoType.Maco, "NOMBRE_ESQUEMA_REPLICA_MACO") });
ContainerDI.Register<IConfigContextApiConnection<SchemaMacoType>>(() =>macoContextConnection, ContainerDI.LifeStyleContainer.Transient); |
Registro del tipo MacoOperatorReplicaManager que implementa la interfaz IMacoOperatorManager. Servicio encargado de consultar datos de operadores vía réplica de BBDD.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IMacoOperatorManager, MacoOperatorReplicaManager>(ContainerDI.LifeStyleContainer.Transient); |
Registro del tipo MacoRepository que implementa la interfaz IMacoRepository. Repositorio encargado de consultar datos de Maco vía réplica de BBDD.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IMacoRepository, MacoRepository>(ContainerDI.LifeStyleContainer.Transient); |
Registro del tipo MacoModuleManager que implementa la interfaz IMacoModuleManager
. Servicio engargado de consultar datos de módulos en Maco vía réplica de BBDD.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IMacoModuleManager<object>, MacoModuleManager>(ContainerDI.LifeStyleContainer.Transient);
} |
|
---|
Bloque de código | ||
---|---|---|
| ||
services.AddMacoOracleServices(macoContextConnection ); |
A continuación se presenta el código completo del ejemplo de configuración de la versión >= 2.0.0:
Bloque de código | ||||||
---|---|---|---|---|---|---|
| ||||||
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
private static string _xmlMacoKey;
private static TicketValidatorConfig _ticketValidatorConfig;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
...
ContainerDI.SetAsyncScopedLifestyle();
ContainerDI.RegisterServices(ref services);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
ContainerDI.RegisterMvcControllers(ref app);
ContainerDI.RegisterMvcViewComponents(ref app);
app.UseDeveloperExceptionPage();
this.InitializeContainer();
...
}
/// <summary>
/// Inicializador de contenedor utilizando el inyector de dependencia ContainerDI.
/// </summary>
private void InitializeContainer()
{
#region registrar maco
_xmlMacoKey = Configuration.GetSection("MacoApiClient:MacoXmlKey").Value;
_ticketValidatorConfig = new TicketValidatorConfig
{
RsaKey = _xmlMacoKey,
ReferenceDate = DateTime.Now,
FutureTicketToleranceMillis = 0,
TicketTtlMillis = 24 * 60 * 60 * 1000,
TicketValidations = new HashSet<TicketValidationType>()
};
_ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Signature); //SignatureTicketValidation: Valida que la firma es correcta
_ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Expired); //ExpiredTicketValidation: Valida que el ticket no este caducado
_ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Future); //FutureTicketValidation: Valida que el ticket no sea futuro
_ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Permission); //PermissionTicketValidation: Valida que el permiso requerido se encuentre en el ticket
ContainerDI.Register<IMacoExceptionManager, MacoExceptionManager>(ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<IMacoUserTransformer, WSMacoUserTransformer>(ContainerDI.LifeStyleContainer.Transient);
var macoApiConfig = new MacoApiConfig(Configuration.GetSection("WebServiceLocator:ServiceAddressMaco").Value)
{
ModuleCode = Configuration.GetSection("MacoApiClient:MacoModule").Value
};
macoApiConfig.EndPoints = new Dictionary<MacoApiClient.WebService.Api.Entity.EndPointType, string>
{
{ MacoApiClient.WebService.Api.Entity.EndPointType.Validacion, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoValidacion").Value },
{ MacoApiClient.WebService.Api.Entity.EndPointType.Operador, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoOperador").Value},
{ MacoApiClient.WebService.Api.Entity.EndPointType.Profesional, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoProfesional").Value }
};
ContainerDI.Register<IMacoApiConfig>(() => macoApiConfig, ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<ITicketValidator>(() => new TicketValidator(_ticketValidatorConfig), ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<IWsMacoActions>(() => new WSMacoManager(macoApiConfig), ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<IMacoAuthentication, WSMacoAuthentication>(ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<IMacoOperatorManager, WSMacoOperatorManager>(ContainerDI.LifeStyleContainer.Transient);
//descomentar en caso de consultar datos de módulo y perfil vía réplica de BBDD
//var macoContextConnection = new MacoContextConnection( new ManagedConfigConnectionBase<SchemaMacoType>[] {
//new ManagedConfigConnectionBase<SchemaMacoType>(ConfigurationManager.ConnectionStrings["MACOConnection"].ConnectionString, SchemaMacoType.Maco, "NOMBRE_ESQUEMA_REPLICA_MACO") });
//ContainerDI.Register<IConfigContextApiConnection<SchemaMacoType>>(() =>macoContextConnection, ContainerDI.LifeStyleContainer.Transient);
//ContainerDI.Register<IMacoOperatorManager, MacoOperatorReplicaManager>(ContainerDI.LifeStyleContainer.Transient);
//ContainerDI.Register<IMacoRepository, MacoRepository>(ContainerDI.LifeStyleContainer.Transient);
//ContainerDI.Register<IMacoModuleManager<object>, MacoModuleManager>(ContainerDI.LifeStyleContainer.Transient);
#endregion registrar maco
}
}
|
Bloque de código | ||||||
---|---|---|---|---|---|---|
| ||||||
using SAS.MacoApiClient.WebService.IoC;
//using SAS.MacoApiClient.ManagedDataAccess.Oracle.IoC;
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
private static string _xmlMacoKey;
private static TicketValidatorConfig _ticketValidatorConfig;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
#region Inyección de dependencia utilizando el inyector por defecto de .NET
#region registrar Maco
_xmlMacoKey = Configuration.GetSection("MacoApiClient:MacoXmlKey").Value;
_ticketValidatorConfig = new TicketValidatorConfig
{
RsaKey = _xmlMacoKey,
ReferenceDate = DateTime.Now,
FutureTicketToleranceMillis = 0,
TicketTtlMillis = 24 * 60 * 60 * 1000,
TicketValidations = new HashSet<TicketValidationType>()
};
_ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Signature); //SignatureTicketValidation: Valida que la firma es correcta
_ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Expired); //ExpiredTicketValidation: Valida que el ticket no este caducado
_ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Future); //FutureTicketValidation: Valida que el ticket no sea futuro
_ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Permission); //PermissionTicketValidation: Valida que el permiso requerido se encuentre en el ticket
var macoApiConfig = new MacoApiConfig(Configuration.GetSection("WebServiceLocator:ServiceAddressMaco").Value)
{
ModuleCode = Configuration.GetSection("MacoApiClient:MacoModule").Value
};
macoApiConfig.EndPoints = new Dictionary<SAS.MacoApiClient.WebService.Api.Entity.EndPointType, string>
{
{ SAS.MacoApiClient.WebService.Api.Entity.EndPointType.Validacion, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoValidacion").Value },
{ SAS.MacoApiClient.WebService.Api.Entity.EndPointType.Operador, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoOperador").Value},
{ SAS.MacoApiClient.WebService.Api.Entity.EndPointType.Profesional, Configuration.GetSection("WebServiceLocator:EndPointAddressMacoProfesional").Value }
};
//registro de servicios de la API MacoApiClient implementación webservices utilizando el inyector de dependencia por defecto de .NET
services.AddMacoWSServices(macoApiConfig, _ticketValidatorConfig);
#endregion
#region registrar servicios Maco que acceden a datos vía réplica BBDD
//descomentar en caso de consultar datos de módulo y perfil vía réplica de BBDD
//var macoContextConnection = new MacoContextConnection( new ManagedConfigConnectionBase<SchemaMacoType>[] {
//new ManagedConfigConnectionBase<SchemaMacoType>(ConfigurationManager.ConnectionStrings["MACOConnection"].ConnectionString, SchemaMacoType.Maco, "NOMBRE_ESQUEMA_REPLICA_MACO") });
//services.AddMacoOracleServices(macoContextConnection);
#endregion
#endregion Inyección de dependencia utilizando el inyector por defecto de .NET
}
}
|
A continuación se describe el uso de la librería.
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 éxito se lanzará una excepción de tipo MacoException. .
Ejemplo:
Bloque de código | ||||
---|---|---|---|---|
| ||||
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:
Bloque de código | ||||
---|---|---|---|---|
| ||||
public boolean autorizarServicio(MacoUser user, string requestedService) {
return _macoAuthentication.ServiceAuthorization(user, requestedService);
} |
Para realizar la comprobación de autenticación y autorización de un módulo concreto con Maco se deberá de hacer uso del método LoginAuthentication, pasando como argumento username, password y código del módulo en Maco. Si la autorización no se ha podido realizar con éxito se lanzará una excepción de tipo MacoException.
Ejemplo:
Bloque de código | ||||
---|---|---|---|---|
| ||||
public boolean LoginAuthentication(string username, string password,string moduleCode) {
return _macoAuthentication.LoginAuthentication(username, password,moduleCode);
} |
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:
Bloque de código | ||||
---|---|---|---|---|
| ||||
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:
Bloque de código | ||||
---|---|---|---|---|
| ||||
//realiza un cambio de contraseña
public void 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.
var passwordRSA = MacoUtil.RSA(password,rsaKey);
// rsaKey es la clave pública de Maco: <RSAKeyValue><Modulus>...</RSAKeyValue> proporcionada por la Oficina Técnica de Interoperabilidad
_macoOperatorManager.ChangeUserPassword(user, passwordRSA);
} |
siendo _macoOperatorManager un objeto de tipo IMacoOperatorManager.
|
---|
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:
Validación de tickets Maco
Bloque de código | ||||
---|---|---|---|---|
| ||||
List<string> permissions = new List<string>() { "CUSTOMPERMISSION", "CUSTOMPERMISSION2" };
HashSet<string> hSetPermissions = new HashSet<string>(permissions);
return new _ticketValidator.IsTicketValid(ticket,null, hSetPermissions) |
Bloque de código | ||||
---|---|---|---|---|
| ||||
private bool Validate(string ticket, string signature) {
return new _ticketValidator.IsTicketValid(ticket, signature);
} |
Siendo _ticketValidator un objeto de tipo ITicketValidator.
Bloque de código | ||||
---|---|---|---|---|
| ||||
private bool ValidarTicket(string sTicketEntrada, string sFirmaEntrada, string sOperacionEntrada, DateTime dtFechaMensaje |
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.
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
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
bool ServiceAuthorization(MacoUser macoUser, string requestedService);
MacoUser LoginAuthentication(string username, string password, string moduleCode = null);
MacoUser LoginAuthentication(MacoUser macoUser);
MacoUser FindOperator(MacoUser petitionerUser, QuerysUserSearchDto querysUserSearchDto);
PaginationList<MacoUser> FindOperators(MacoUser petitionerUser, QuerysUserSearchDto querysUserSearchDto);
void ChangeUserPassword(MacoUser user, string password);
MacoUser FindProfessional(MacoUser petitionerUser, QuerysUserSearchDto querysUserSearchDto);
PaginationList<MacoUser> FindProfessionals(MacoUser petitionerUser, QuerysUserSearchDto querysUserSearchDto);
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/
void ThrowIfErrorIsPresent(XmlDocument response);
void ThrowException(short errorCode, string errorDescription = "");
src/Api/entity
bool IsValid(TEntity entity);
src/Ticket
TicketValidatorConfig Config { get; set; }
HashSet<TicketValidation> Validations { get; }
bool IsTicketValid(string ticket, string ticketSignature = null, HashSet<string> permissions = null);
src/User
MacoUser NewMacoUser(XmlNode oper);
MacoUser NewMacoUser(XmlDocument doc);
PaginationList<MacoUser> ProccessUsersResponse(string xmlResponse, int? pageNumber, int? usersPerPage);
src/utils
src/WebService
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);
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
MacoLocation GetModuleByCode(IGenericAuthContext<T> context, QuerysUserSearchDto filtro);
MacoLocation GetRoleModuleByCode(IGenericAuthContext<T> context, QuerysUserSearchDto filtro);
Proyecto SAS.MacoApiClient.Core : Nuevo proyecto añadido a la solución
Modulo GetModuleByCode(QueryCriteriaModule filtro);
Obtener perfil a través del código del móduloModuloPerfil GetRoleModuleByCode(QueryCriteriaModule filtro);
Proyecto SAS.MacoApiClient.ManagedDataAccess.Oracle : Nuevo proyecto añadido a la solución. Acceso a datos de Maco utilizando réplica de BBDD Oracle
[!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 :
2.3.0 - Se añade posibilidad de configurar tipo de contexto utilizado (manejado o no manejado) Proyecto SAS.MacoApiClient.ManagedDataAccess.Oracle :
public bool GetIsManagedContext(SchemaMacoType tipo)
{
return this.configuracion.FirstOrDefault(d => d.ShemaType == tipo).IsManagedContext;
}
2.4.0 - Se añade la versión réplica del método FindOperator Proyecto SAS.MacoApiClient :
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
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))
{
...
}
Acceder a nuget e instalar la librería SAS.MacoApiClient.
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 la clase Startup del proyecto MVC:
Primero, en el fichero Startup.cs, método ConfigureServices, inicializamos el contenedor de inyección de dependencia:
public void ConfigureServices(IServiceCollection services)
{
...
ContainerDI.SetAsyncScopedLifestyle(); // establecer estilo de vida por defecto del contenedor de inyección. Permite procesar tanto operaciones asíncronas como síncronas
ContainerDI.RegisterServices(ref services);
...
}
ContainerDI, clase del componente común SAS.Util.Injection, el cual permite el registro por inyección de dependencia de los diferentes servicios y tipos utilizados en el sistema.
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": "CLAVEPUBLICAMACO",
"Module": "MODULOMACO"
},
(2) "WebServiceLocator": {
"ServiceAddressMaco": "http://WEBSERVICEMACO/",
},
(1) Configuración de la clave púba de Maco , XmlKey, y código del módulo Maco, "MODULOMACO. La Oficina Técnica de Interoperabilidad es la que proporciona esta información.
(2) Configuración de la dirección url del servicio web de Maco, "WEBSERVICEMACO"
En el fichero Startup.cs, método InitializeContainer, añadir la siguiente configuración:
(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
A continuación se describe el uso de la librería.
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);
}
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.
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)
{
|
var |
_xmlMacoKey = |
"CLAVE_PUBLICA_MACO"; |
var result; var _ticketValidatorConfig = new TicketValidatorConfig { RsaKey = _xmlMacoKey, ReferenceDate = dtFechaMensaje, |
|
|
|
|
FutureTicketToleranceMillis = 0, |
|
|
TicketTtlMillis = 24 * 60 * |
60 |
* 1000, |
|
TicketValidations = new |
HashSet<TicketValidationType>() }; |
_ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Signature); //SignatureTicketValidation: Valida que la firma es correcta |
|
|
_ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Expired); //ExpiredTicketValidation: Valida que el ticket no este caducado |
|
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.
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.
"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)_ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Future); //FutureTicketValidation: Valida que el ticket no sea futuro _ticketValidatorConfig.TicketValidations.Add(TicketValidationType.Permission); //Valida que los permisos son los indicados en el ticket List<string> permissions = new List<string>() { sOperacionEntrada }; //si sOperacionEntrada está formado por diferentes permisos separados por un caracter separador, realizar una operación Split por dicho caracter separador HashSet<string> hSetPermissions = new HashSet<string>(permissions); var ticketValidator = new TicketValidator(_ticketValidatorConfig); try { result = ticketValidator.IsTicketValid(sTicketEntrada, sFirmaEntrada, hSetPermissions); } |
catch (MacoException me) { |
|
|
result = |
false; |
} |
return result; |
Se recomienda utilizar la versión 2.4.3, para que se utilice la comunicación HTTPS con los servicios web de Maco.[!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)
} |
En el ejemplo anterior se crea un objeto de tipo TicketValidator con el operador "new". En el caso de haber usado inyección por dependencia para la configuración de los servicios, sólo habría que obtener una instancia de ITicketValidator y asignarle en el atributo Config, ticketValidator.Config, la configuración _ticketValidatorConfig adecuada.
En el siguiente ejemplo se muestra métdoos de autenticación de un usuario y validación de un ticket utilizando interfaces:
Bloque de código | ||||
---|---|---|---|---|
| ||||
private IMacoAuthentication _macoAuthentication;
private ITicketValidator _ticketValidator;
public UserService( IMacoAuthentication macoAuthentication, ITicketValidator ticketValidator)
{
_macoAuthentication = macoAuthentication;
_ticketValidator = ticketValidator;
}
public MacoUser LoginAuthentication(string loginName, string password, string moduleCode)
{
try
{
return _macoAuthentication.LoginAuthentication(loginName, password, moduleCode);
}
catch (Exception ex)
{
throw ex;
}
}
public bool IsTicketValid(string ticket, string ticketSignature)
{
return _ticketValidator.IsTicketValid( ticket, ticketSignature);
} |