martes, 22 de septiembre de 2020

Transacciones Fiori

 

/UI2/CACHERegister service for UI2 cache use
/UI2/CACHE_DELDelete cache entries
/UI2/CHIPChip Registration
/UI2/CUSTCustomizing of UI Technologies
/UI2/FLCFiori Launchpad Checks
/UI2/FLIAFiori Launchpad Intent Analyis
/UI2/FLPSAP Fiori Launchpad
/UI2/FLP_CONTCHECKFiori Launchpad – Content Checks
/UI2/FLP_INTENTCHECKFiori Launchpad – Intent Checks
/UI2/FLPD_CONFFiori Launchpad Designer (cross-client)
/UI2/FLPD_CUSTFiori Launchpad Designer (client-specific)
/UI2/GW_ACTIVATEGateway – Activation
/UI2/GW_APPS_LOGGateway – Application Log
/UI2/GW_ERR_LOGGateway – Error Log
/UI2/GW_MAINT_SRVGateway – Service Maintenance
/UI2/GW_SYS_ALIASGateway – Manage SAP System Alias
/UI2/NAVRegister navigation objects
/UI2/NAVPROVDefine navigation provider
/UI2/NWBCStart UI2 NWBC
/UI2/NWBC_CFG_CUSTNWBC Configuration (Customer)
/UI2/NWBC_CFG_P_CUSTNWBC Config: Define Parameter (Cust)
/UI2/NWBC_CFG_P_SAPNWBC Config: Define Parameter (SAP)
/UI2/NWBC_CFG_SAPNWBC Configuration (SAP)
/UI2/PERS_DELCleanup Personalisatation Service
/UI2/POWLRegister POWL for OData consumption
/UI2/SEMOBJDefine Semantic Object – Customer
/UI2/SEMOBJ_SAPDefine Semantic Object – SAP

sábado, 22 de agosto de 2020

Obtención de token JwtBearer desde Azure AD, para el consumo de una API registrada como aplicación en Azure

Una manera de autenticar API's que están en la nube cuando se utiliza Azure como plataforma de nube es utilizar el Directorio activo como administrador de las identidades es posible pedirle a Azure AD que de un registro de una aplicación "no interactiva" nos pueda enviar un token que pueda ser enviado a la API que consumiremos misma que estará autenticada y autorizada en Azure AD.

Para ver el detalle de cómo hacer el registro de una API en Azure ver el siguiente post, el cual viene muy completo y sencillo, sin embargo, el tema de clientes para Xamarin y Blazor no lo menciona, que es justo lo que se anexa en este post: 

https://dotnetplaybook.com/secure-a-net-core-api-using-bearer-authentication/

 

Una vez habiendo hecho el registro de la API y del cliente de esa API y habiendo publicado la API es momento de consumirla y para ello nos puede ser útil los siguientes métodos. El primero aplica para Xamarin y para Blazor Hybrid Mobile. Y el segundo para aplicaciones tanto Blazor, .NET Core y ASP.NET Core.


Método para obtener el token y un cliente http listo para invocar la API en Xamarin y Blazor Hybrid Mobile usando MSAL.NET.


private async Task < HttpClient > GetSecureClient()

{

     Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult              authresult = null;

     var auth = new AuthenticationContext(cfg.Authority); 

  authresult = await auth.AcquireTokenAsync(cfg.ResourceId, new Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential(cfg.ClientId, cfg.ClientSecret)); 

  HttpClient cte = new HttpClient() {  BaseAddress = this.BaseAddress  }; 

  var defaultRequestHeaders = cte.DefaultRequestHeaders;

  if (defaultRequestHeaders.Accept == null || 

  !defaultRequestHeaders.Accept.Any(m =>m.MediaType == "application/json")) 

  { 

    cte.DefaultRequestHeaders.Accept.Add(new

     MediaTypeWithQualityHeaderValue("application/json")); 

  }

 

  defaultRequestHeaders.Authorization = 

  new AuthenticationHeaderValue("bearer", authresult.AccessToken);

 

  return cte; 

}


Método para obtener el token y un cliente http listo para invocar la API en .NET Core, ASP.NET Core Web API y Blazor usando Microsoft.Identity.Client.

private async Task<HttpClient> GetSecureClient()
        {
 
            IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(cfg.ClientId). 
                            WithClientSecret(cfg.ClientSecret). 
                            WithAuthority(new Uri(cfg.Authority)).Build();
 
            string[] ResourcesIds = new string[] { cfg.ResourceID }; 
            AuthenticationResult authresult = null;        
 
            authresult = await app.AcquireTokenForClient(ResourcesIds).ExecuteAsync();       
 
            HttpClient cte = new HttpClient() { BaseAddress = this.BaseAddress };
 
            var defaultRequestHeaders = cte.DefaultRequestHeaders; 
 
            if (defaultRequestHeaders.Accept == null || 
                !defaultRequestHeaders.Accept.Any(m => m.MediaType == "application/json"))
 
            { 
                cte.DefaultRequestHeaders.Accept.Add(new 
                    MediaTypeWithQualityHeaderValue("application/json")); 
            }
 
            defaultRequestHeaders.Authorization = 
                new AuthenticationHeaderValue("bearer", authresult.AccessToken);
 
            return cte;
 
        }

 


martes, 7 de abril de 2020

Búsqueda de elementos por tipo en JS, y asignación de manejadores de eventos


Usando el DOM especificamente la instruccion querySelectorAll, podemos sin necesidad de usar JQuery buscar los elementos de un tipo especifico y asignar manejadores de eventos a cada elemento de modo que se pueda escribir un código generico para manejar los algunos eventos en particular.

Ejemplo de búsqueda de radiobuttons en todo el documento html, para asegurarse de que solo hay 1 activado y al darle clic en cualquiera de los radio buttons.


//Búsqueda de todos los radio buttons para asociarles el evento click

       
       var radios= document.querySelectorAll('input[type="radio"]');
    radios.forEach(function(itm) {
            itm.onclick = function() {
                var rds = document.querySelectorAll('input[type="radio"]');

                rds.forEach(function(chk) {
                    chk.checked = false; //poner en check false a todos los radio buttons
                });

                this.checked = true; // habilitar el check del que recibio el clic

                //Colocar aquí código para acciones especificas de negocio o funcionalidades

            }        
    }

sábado, 12 de agosto de 2017

Comandos de red

Commands to clean DNS nd routing tables in Windows

netsh interface ip delete destinationcache
ipconfig /flushdns

Consuming a WSO2 ESB secured proxy with WS-Security UsernameToken policy, within .NET C# Application


This is the pattern that need to be configured on WSO2 ESB


Step 1: 
Create the policy using the WSO2 Developer Studio.


To get his done you should click in the dashboard on the Registry Resource in the show dialog you have to pick the option from existing template, then choose WS-Policy at the resource template combobox.


Then we need to get the roles from the server





The generated policy must look like this

<wsp:Policy wsu:Id="UTOverTransport"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <wsp:Policy>
                    <sp:TransportToken>
                        <wsp:Policy>
                            <sp:HttpsToken RequireClientCertificate="false"/>
                        </wsp:Policy>
                    </sp:TransportToken>
                    <sp:AlgorithmSuite>
                        <wsp:Policy>
                            <sp:Basic256/>
                        </wsp:Policy>
                    </sp:AlgorithmSuite>
                    <sp:Layout>
                        <wsp:Policy>
                            <sp:Lax/>
                        </wsp:Policy>
                    </sp:Layout>
                    <sp:IncludeTimestamp/>
                </wsp:Policy>
            </sp:TransportBinding>
            <sp:SignedSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <wsp:Policy>
                    <sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"/>
                </wsp:Policy>
            </sp:SignedSupportingTokens>
        </wsp:All>
    </wsp:ExactlyOne>
    <rampart:RampartConfig xmlns:rampart="http://ws.apache.org/rampart/policy">
        <rampart:user>wso2carbon</rampart:user>
        <rampart:encryptionUser>useReqSigCert</rampart:encryptionUser>
        <rampart:timestampPrecisionInMilliseconds>true</rampart:timestampPrecisionInMilliseconds>
        <rampart:timestampTTL>300</rampart:timestampTTL>
        <rampart:timestampMaxSkew>300</rampart:timestampMaxSkew>
        <rampart:timestampStrict>false</rampart:timestampStrict>
        <rampart:tokenStoreClass>org.wso2.carbon.security.util.SecurityTokenStore&#xd;
        </rampart:tokenStoreClass>
        <rampart:nonceLifeTime>300</rampart:nonceLifeTime>
    </rampart:RampartConfig>
    <sec:CarbonSecConfig xmlns:sec="http://www.wso2.org/products/carbon/security">
        <sec:Authorization>
            <sec:property name="org.wso2.carbon.security.allowedroles">admin</sec:property>
        </sec:Authorization>
    </sec:CarbonSecConfig>
</wsp:Policy>



The App/Web.config file must look like 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="wsSecuredProxySoap12Binding">
                    <security includeTimestamp="true"
                              authenticationMode="UserNameOverTransport"
                              defaultAlgorithmSuite="Basic256"
                              requireDerivedKeys="false"
                              securityHeaderLayout="LaxTimestampLast"  
                              messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
                    </security>
                    <textMessageEncoding messageVersion="Soap11"></textMessageEncoding>
                    <httpsTransport authenticationScheme="Basic" maxReceivedMessageSize="2000000000"/>
                </binding>
            </customBinding>
        </bindings>
        <client>            
            <endpoint address="https://DESKTOP-T5HMT2C:8243/services/wsSecuredProxy.wsSecuredProxyHttpsSoap12Endpoint"
                binding="customBinding" bindingConfiguration="wsSecuredProxySoap12Binding"
                contract="SecuredService.wsSecuredProxyPortType" name="wsSecuredProxyHttpsSoap12Endpoint" />
        </client>
    </system.serviceModel>
</configuration>

viernes, 26 de febrero de 2016

Cambio cultura Oracle Client

Para superar el problema, debes ir al REGEDIT y verificar en la entrada: HKEY_LOCAL_MACHINE -> SOFTWARE -> ORACLE -> HOME0, y cambiar la clave NLS_LANG = SPANISH_SPAIN.WE8ISO8859P1

dicha clave debe quedar

NLS_LANG = AMERICAN_AMERICA.WE8ISO8859P1

NOTA: la carpeta HOME0, también puede ser HOME1 o HOME2, dependiendo el sistema operativo o la versión del ORACLE que tengas instalado..

Si desea cambiar en el cliente entonces debes buscar en:
HKLM -> SOFTWARE ->ORACLE KEY_ORACLIENT10G_HOME1
la llave NLS_LANG debe quedar :


NLS_LANG = AMERICAN_AMERICA.WE8ISO8859P1

jueves, 15 de octubre de 2015

Queries to find Locks And Active Sessions in Oracle

SELECT vs.username,
 vs.osuser,
 vh.sid locking_sid,
 vs.status status,
 vs.module module,
 vs.program program_holding,
 jrh.job_name,
 vsw.username,
 vsw.osuser,
 vw.sid waiter_sid,
 vsw.program program_waiting,
 jrw.job_name,
 'alter system kill session ' || ''''|| vh.sid || ',' || vs.serial# || ''';'  "Kill_Command"
FROM v$lock vh,
 v$lock vw,
 v$session vs,
 v$session vsw,
 dba_scheduler_running_jobs jrh,
 dba_scheduler_running_jobs jrw
WHERE   (vh.id1, vh.id2)
        IN
        (
            SELECT id1, id2
            FROM v$lock
            WHERE request = 0
            INTERSECT
            SELECT id1, id2
            FROM v$lock
            WHERE lmode = 0
        )
 AND vh.id1 = vw.id1
 AND vh.id2 = vw.id2
 AND vh.request = 0
 AND vw.lmode = 0
 AND vh.sid = vs.sid
 AND vw.sid = vsw.sid
 AND vh.sid = jrh.session_id(+)
 AND vw.sid = jrw.session_id(+);



 select * from V$SESSION b, V$PROCESS a
 where b.paddr = a.addr
 and type = 'USER'
 order by spid;
 

martes, 11 de agosto de 2015

JAX-WS Web service with Application Authentication, consumed by C# client

Web Service JAX-WS with application authentication

This listing corresponds to an extract of an EJB with a session bean published as web service.

The yellow background code is the relevant portion.

         ...

            @Resource
            WebServiceContext webServiceContext;
            /**
             * Default constructor.
             */
            public WsEmpleados() {
                        // TODO Auto-generated constructor stub
            }          
        // Las excepciones emitidas aqui se envian como SOAP Faults
            public ArrayList<Empleados> ObtenerEmpleados(ArrayList<Paises> paises,
                                   String fecha) throws NonExistentData, InvalidUser {
                       
                       
                        MessageContext messageContext = webServiceContext.getMessageContext();

                        // Mapeo de encabezados http
                        Map<?,?> requestHeaders = (Map<?,?>) messageContext.get(MessageContext.HTTP_REQUEST_HEADERS);
                        List<?> userheaders= (List<?>) requestHeaders.get("username");
                        List<?> paswordheaders= (List<?>) requestHeaders.get("password");

                        String username = "";
                        String password = "";

                        if (userheaders!= null) {
                                   username = userheaders.get(0).toString();
                        }

                        if (paswordheaders!= null) {
                                   password = paswordheaders.get(0).toString();
                        }

       
//The credential validation can be done by a lot of options this is just one sample easy to understand
                        if (!(username.equals("usr1") && password.equals("VFSkdaass"))) {
                                   throw new InvalidUser();
                        }

                       
                    ...
                        return empleados;
            }
}


C# code listing to consume the Java JAX-WS web service with application authentication using http headers

Once you have created the proxy using the Java Web service WSDL we can do the call of the exposed method by using the OperationContextScope in order to be able to send http headers or Soap headers depending on the WS Implementation.

//Web service proxy generated by Visual Studio
Empleados.WsEmpleadosRemoteClient  proxy = new wsEmpNPrec.Empleados.WsEmpleadosRemoteClient ();

//Arreglo con el resultado de la invocación
                    wsEmpNPrec.Empleados.Empleado[] empleados = null;

//Adding the http headers throught the OperationContext.
                    using (new OperationContextScope(proxy.InnerChannel))
                    {
                        HttpRequestMessageProperty userHeader = new HttpRequestMessageProperty();
                        userHeader.Headers.Add("username", "usr1");
                        userHeader.Headers.Add("password", "VFSkdaass");

                        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = userHeader;
                        empleados = proxy.ObtenerEmpleados  (parametros2);
                    }  



This is not a good way to implement application authentication but is still one and if you can add HTTPS to this, you can have a not to bad and fast option to do it, anyway the http headers can be used for other purposes too.

Transacciones Fiori

  /UI2/CACHE Register service for UI2 cache use /UI2/CACHE_DEL Delete cache entries /UI2/CHIP Chip Registration /UI2/CUST Customizing of UI ...