Implementación del manejador de desafíos en aplicaciones Windows 8.1 Universal y Windows 10 UWP

improve this page | report issue

Visión general

Al intentar acceder al recurso protegido, el servidor (la comprobación de seguridad) devuelve al cliente una lista que contiene uno o más desafíos que debe gestionar el cliente.
Esta lista se recibe como un objeto JSON, listando el nombre de la comprobación de seguridad con un JSON opcional de datos adicionales:

{
  "challenges": {
    "SomeSecurityCheck1":null,
    "SomeSecurityCheck2":{
      "some property": "some value"
    }
  }
}

A continuación, el cliente debe registrar un manejador de desafíos para cada comprobación de seguridad.
El manejador de desafíos define el comportamiento del lado de cliente que es específico de la comprobación de seguridad.

Creación del manejador de desafíos

Un manejador de desafíos es una clase que maneja desafíos enviados por MobileFirst Server como, por ejemplo, la visualización de una pantalla de inicio de sesión, la recopilación de credenciales y la devolución a la comprobación de seguridad.

En este ejemplo, la comprobación de seguridad es PinCodeAttempts que se definió en Implementación de CredentialsValidationSecurityCheck. El desafío que ha enviado la comprobación de seguridad contiene el número de intentos restantes para iniciar sesión (remainingAttempts), y un errorMsg opcional.

Cree una clase C# que amplíe Worklight.SecurityCheckChallengeHandler:

public class PinCodeChallengeHandler : Worklight.SecurityCheckChallengeHandler
{
}

Manejo de un desafío

El requisito mínimo de la clase SecurityCheckChallengeHandler es implementar un constructor y un método HandleChallenge, que es el responsable de solicitar al usuario las credenciales. El método HandleChallenge recibe el desafío como un Object.

Añadir un método constructor:

public PinCodeChallengeHandler(String securityCheck) {
    this.securityCheck = securityCheck;
}

En este ejemplo de HandleChallenge, una alerta le solicita al usuario que introduzca el código PIN:

public override void HandleChallenge(Object challenge)
{
    try
    {
      JObject challengeJSON = (JObject)challenge;

      if (challengeJSON.GetValue("errorMsg") != null)
      {
          if (challengeJSON.GetValue("errorMsg").Type == JTokenType.Null)
              errorMsg = "This data requires a PIN Code.\n";
      }

      await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
           async () =>
           {
               _this.HintText.Text = "";
               _this.LoginGrid.Visibility = Visibility.Visible;
               if (errorMsg != "")
               {
                   _this.HintText.Text = errorMsg + "Remaining attempts: " + challengeJSON.GetValue("remainingAttempts");
               }
               else
               {
                   _this.HintText.Text = challengeJSON.GetValue("errorMsg") + "\n" + "Remaining attempts: " + challengeJSON.GetValue("remainingAttempts");
               }

               _this.GetBalance.IsEnabled = false;
           });
    } catch (Exception e)
    {
        Debug.WriteLine(e.StackTrace);
    }
}

La implementación de showChallenge se incluye en la aplicación de ejemplo.

Si las credenciales son incorrectas, puede esperar que la infraestructura llame a HandleChallenge de nuevo.

Envío de la respuesta de comprobación

Cuando haya recopilado las credenciales de la IU, utilice los métodos ShouldSubmitChallengeAnswer() y GetChallengeAnswer() de SecurityCheckChallengeHandler para enviar una respuesta a la comprobación de seguridad. ShouldSubmitChallengeAnswer() devuelve un valor booleano que indica si la respuesta de verificación de identidad debería enviarse a la comprobación de seguridad. En este ejemplo, PinCodeAttempts espera una propiedad denominada pin que contiene el código PIN enviado:

public override bool ShouldSubmitChallengeAnswer()
{
  JObject pinJSON = new JObject();
  pinJSON.Add("pin", pinCodeTxt.Text);
  this.challengeAnswer = pinJSON;
  return this.shouldsubmitchallenge;
}

public override JObject GetChallengeAnswer()
{
  return this.challengeAnswer;
}

Cancelación del desafío

En algunos casos, como cuando se pulsa el botón Cancelar en la IU, desea indicarle a la infraestructura que descarte este desafío por completo.

Para ello, sustituya el método ShouldCancel.

public override bool ShouldCancel()
{
  return shouldsubmitcancel;
}

Registro del manejador de desafíos

Para que el manejador de desafíos escuche los desafíos adecuados, debe pedirle a la infraestructura que se asocie con el manejador de desafíos con un nombre de comprobación de seguridad específico.

Para ello, inicialice el manejador de desafíos con la comprobación de seguridad de la siguiente manera:

PinCodeChallengeHandler pinCodeChallengeHandler = new PinCodeChallengeHandler("PinCodeAttempts");

A continuación, debe registrar la instancia del manejador de desafíos:

IWorklightClient client = WorklightClient.createInstance();
client.RegisterChallengeHandler(pinCodeChallengeHandler);

Aplicación de ejemplo

Los ejemplos PinCodeWin8 y PinCodeWin10 son aplicaciones C# que utilizan ResourceRequest para obtener un saldo de banco.
El método está protegido con un código PIN y un máximo de 3 intentos.

Haga clic para descargar el proyecto Maven de SecurityCheckAdapters.
Haga clic para descargar el proyecto de Windows 8.
Haga clic para descargar el proyecto Windows 10 UWP.

Uso de ejemplo

Siga el archivo README.md del ejemplo para obtener instrucciones.

Aplicación de ejemplo

Inclusive terminology note: The Mobile First Platform team is making changes to support the IBM® initiative to replace racially biased and other discriminatory language in our code and content with more inclusive language. While IBM values the use of inclusive language, terms that are outside of IBM's direct influence are sometimes required for the sake of maintaining user understanding. As other industry leaders join IBM in embracing the use of inclusive language, IBM will continue to update the documentation to reflect those changes.
Last modified on March 13, 2018