La extensión de autenticación de la identificación de acceso se utiliza para el inicio de sesión único (SSO) de un usuario en Blackboard Open LMS desde un sistema externo, como CampusVue. La extensión de identificación de acceso funciona mediante un secreto compartido entre Blackboard Open LMS y el sistema externo. En función de este secreto compartido y de un inicio de sesión administrativo configurado, el sistema externo genera un token de un solo uso que puede emplearse para crear una URL única. El sistema externo proporciona la URL única al usuario y, una vez que este hace clic en ella, Blackboard Open LMS valida el acceso del usuario según la IP del sistema externo, el token único y el secreto compartido. Este sistema es una autenticación segura basada en un token que utiliza un sistema compartido para construir y deconstruir tokens generados.

La extensión de autenticación de ID de acceso debe estar instalada y habilitada antes de que usted pueda actualizar la configuración.


Instalar & habilitar la autenticación de ID de acceso

Blackboard instala y habilita la autenticación de la identificación de acceso por usted. Comuníquese con su ejecutivo de cuentas o su gerente de participación sobre la posibilidad de agregarla a su instancia de Blackboard Open LMS, si aún no lo ha hecho.


Ajustes globales de la identificación de acceso

Pasos: Administración > Administración del sitio > Extensiones > Autenticación > Autenticación de ID de acceso

  1. En Administración del sitio, seleccione Extensiones, Autenticación y Autenticación de ID de acceso.
  2. Configure los ajustes generales.
    • Lista de IP permitidas: Introduzca todas las IP que puedan comunicarse con la extensión de autenticación. Cada entrada debe estar en una única línea. Solo las direcciones IP completas o las direcciones en notación CDIR serán aceptadas como entradas válidas.
    • Clave secreta: la clave secreta ingresada debe ser idéntica a la configurada del lado del sistema con la que está configurando el inicio de sesión único.
    • Nombre de usuario: especifique el nombre de usuario para acceder a la URL de extremo.
    • Contraseña: especifique la contraseña para acceder a la URL de extremo.
    • Búsqueda de usuarios: Indique el campo de perfil de usuario para las búsquedas de usuario.
      • idnumber
      • username
    • Duración de ID de acceso: especifique la duración durante la cual es válido el ID de acceso generado (en minutos). Predeterminado: 5 minutos.
    • Algoritmo hash: especifique la validación del algoritmo hash para los parámetros de entrada.
      • SHA-256 (por defecto)
      • SHA-1

Bloquear campos de usuario

La sección Bloquear campos de usuario del ajuste de la extensión de autenticación se usa para bloquear el acceso de un usuario para actualizar un valor de un campo de perfil de usuario. Esto es útil para los datos de usuario que se actualizan mediante un sistema externo o que el administrador no desea que el usuario cambie una vez ingresados. Si bloquea campos requeridos por Moodle, asegúrese de proporcionar dichos datos al crear cuentas de usuario o las cuentas no podrán usarse. Considere establecer el modo de bloqueo en “Desbloqueado si está vacío” para evitar este problema. Los administradores solo pueden bloquear el siguiente campo de perfil:

  • Nombre
  • Apellido
  • Dirección de correo electrónico
  • Ciudad/pueblo
  • País
  • Idioma
  • Descripción
  • página web
  • Número de ID
  • Institución
  • Departamento
  • Teléfono 1
  • Teléfono 2
  • Dirección

Cada campo de perfil puede configurarse en uno de los siguientes ajustes con el valor predeterminado desbloqueado:

  • Desbloqueado: el usuario puede cambiar el valor en el campo de perfil en cualquier momento.
  • Desbloqueado si está vacío: el usuario solo puede establecer el valor para el campo de perfil de usuario una vez. Si un sistema externo establece este valor, el usuario no puede cambiarlo en Blackboard Open LMS.
  • Bloqueado: el usuario no puede cambiar el valor del campo de perfil de usuario en Blackboard Open LMS; debe hacerlo un administrador o un sistema externo.

Ejemplo de flujo de trabajo de identificación de acceso

Ejemplo de flujo de trabajo de inicio de sesión único

El siguiente es un ejemplo de flujo de trabajo para la configuración de un inicio de sesión único con autenticación de ID de acceso.

Paso 1: generar la ficha

El primer paso del inicio de sesión único con autenticación de ID de acceso requiere que se genere un token con un secreto previamente compartido. Consulte la Autenticación de ID de acceso a continuación para ver un código de muestra para la generación del token.

Paso 2: validar el token

El servidor cliente envía una solicitud al punto de conexión del servicio web para generar el token, que se encuentra en https://site.url/auth/accessid/webservices.php. Reemplace "site.url" con el nombre de dominio de su sitio de Blackboard Open LMS. La solicitud debe ser un POST a través de canales seguros (HTTPS). Además, la solicitud del servidor cliente debe validarse dentro del rango establecido mediante los ajustes de autenticación de ID de acceso Lista de IP permitidas. El "accessid" que se obtiene es válido durante el tiempo especificado en Duración de ID de acceso.

La siguiente información debe aprobarse con cada publicación para la generación de la ficha:

  • username: el nombre de usuario preestablecido. Se configura en los ajustes de autenticación de identificación de acceso dentro de Blackboard Open LMS.
  • pass: la contraseña preestablecida. Se configura en los ajustes de autenticación de identificación de acceso dentro de Blackboard Open LMS.
  • timestamp: la misma marca de tiempo que se usó para generar la ficha.
  • token: la ficha, generada en el paso 1.
  • userid: la identificación del usuario, según se define en el campo Búsqueda de usuarios en los ajustes de autenticación de identificación de acceso dentro de Blackboard Open LMS. Por ejemplo, si el ajuste Búsqueda de usuarios se configura con "idnumber", en este campo se aprobaría el número de identificación del usuario autenticado.

Respuesta correcta de ejemplo

<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<auth_accessid_lib_server_service generator="zend" version="1.0">
<get_accessid>
<response>
<accessid>
hojHWTuH8oClZjfR</accessid>
</response>
<status>
success</status>
</get_accessid>
</auth_accessid_lib_server_service>

Respuesta incorrecta de ejemplo

<?xml version="1.0" encoding="UTF-8"?><rest generator="zend" version="1.0">
<response>
<message>Remote IP address of 111.111.111.111 failed to validate. If remote IP address is correct, then validate the Allowed IP list setting.</message>
</response>
<status>failed</status></rest>

Paso 3: redireccionar al usuario a Blackboard Open LMS

Una vez que se obtuvo el accessid, se debe redireccionar al usuario al punto de conexión en Blackboard Open LMS para registrarlo automáticamente en Blackboard Open LMS:

https://site.url/auth/accessid/access.php?id=[ACCESSID]

De manera opcional, se puede redireccionar al usuario a una página dentro de Blackboard Open LMS. Esto es común cuando el usuario se debe dirigir a un curso específico, y no a la Página principal ni a Mi Moodle. En este caso, se transmitiría un parámetro de redireccionamiento con codificación URL [LOCAL_URL] junto con el token de autenticación [ACCESSID]:

https://site.url/auth/accessid/access.php?id=[ACCESSID]&redirect=[LOCAL_URL]

Para el redireccionamiento a un curso, los parámetros podrían ser los siguientes:

  • %2Fcourse%2Fview.php%3Fid%3DXXX
  • %2Fcourse%2Fview.php%3Fname%3DXXX
  • %2Fcourse%2Fview.php%3Fidnumber%3DXXX

Por ejemplo, una URL de redireccionamiento completa para enviar al usuario al curso con una ID interna de 245 se vería de la siguiente manera:

https://example.mrooms.net/auth/accessid/access.php?id=1234567890ABCD&redirect=%2Fcourse%2Fview.php%3Fid%3D245

Diagrama de ejemplo

Ejemplos de código de ID de acceso

Los siguientes ejemplos de códigos comparan un hash generado usando las variables:

  • Secreto compartido: GerwtYxxd34
  • userid: janedoe
  • timestamp: 1326827023
  • username: jdoe
  • pass: pass

Ficha esperada: 153283f1909be96a23a3324b345098010320b0db1fd71a726bbad0ca3cfd67ff

Ejemplo de Java 1

import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/*** @author Darko Miletic**/public class Sample { public static String generate_token_impl(String[] params, String secret, String algorithm) { MessageDigest algo = null; try { algo = MessageDigest.getInstance(algorithm); StringBuilder sb = new StringBuilder(); for (String param : params) { String salted_param = secret + param; sb.append(salted_param); } return byte2hex(algo.digest(sb.toString().getBytes())); } catch (NoSuchAlgorithmException excp) { return ""; } } public static String generate_token(String[] params, String secret) { return generate_token_impl(params, secret, "SHA-256"); } public static String byte2hex(byte[] hash) { StringBuilder sb = new StringBuilder(); for (byte b : hash) { sb.append(String.format("%02x", b)); } return sb.toString(); } /** * @param args */ public static void main(String[] args) { String[] testparams = {"janedoe", "1326827023", "jdoe", "pass"}; String secret = "GerwtYxxd34"; String known_result = "153283f1909be96a23a3324b345098010320b0db1fd71a726bbad0ca3cfd67ff"; String result = generate_token(testparams, secret); if (result.equals(known_result)) { System.out.println("Hashes match"); } else { System.out.println("Hashes DO NOT match:"); System.out.println(result); } }}

Ejemplo de Java 2

import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.InputStreamReader;import java.io.StringReader;import java.net.URL;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import javax.net.ssl.HttpsURLConnection;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.CharacterData;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.InputSource;public class AccessIDGenerator {private final static String USER_AGENT = "Mozilla/5.0";private final static String FORWARD_URL = "https://cccccccc-sandbox.mrooms.net/auth/accessid/access.php?id=";public static String generate_token_impl(String[] params, String secret, String algorithm) {MessageDigest algo = null;try {algo = MessageDigest.getInstance(algorithm);StringBuilder sb = new StringBuilder();for (String param : params) {String salted_param = secret + param;sb.append(salted_param);}return byte2hex(algo.digest(sb.toString().getBytes()));} catch (NoSuchAlgorithmException excp) {return "";}}public static String generate_token(String[] params, String secret) {return generate_token_impl(params, secret, "SHA-256");}public static String byte2hex(byte[] hash) {StringBuilder sb = new StringBuilder();for (byte b : hash) {sb.append(String.format("%02x", b));}return sb.toString();}public static String getAccessID(String token) {try {String url = "https://cccccccc-sandbox.mrooms.net/auth/accessid/webservices.php"; URL obj = new URL(url);HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();//add request headercon.setRequestMethod("POST");con.setRequestProperty("User-Agent", USER_AGENT);con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");String urlParameters = "username=" + username + "&pass=" + pass + "&timestamp=" + timestamp + "&token=" + token + "&userid=" + userid;// Send post requestcon.setDoOutput(true);DataOutputStream wr = new DataOutputStream(con.getOutputStream());wr.writeBytes(urlParameters);wr.flush();wr.close();int responseCode = con.getResponseCode();System.out.println("\nSending 'POST' request to URL : " + url);System.out.println("Post parameters : " + urlParameters);System.out.println("Response Code : " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));String inputLine;StringBuffer response = new StringBuffer();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();//print result//System.out.println(response.toString());return response.toString();} catch (Exception l_ex) {}return "";}static String parseAccessId (String xmlString) {try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();// Load the input XML document, parse it and return an instance of the// Document class.InputSource is = new InputSource();is.setCharacterStream(new StringReader(xmlString));Document document = builder.parse(is);NodeList nodeList = document.getDocumentElement().getChildNodes();for (int i = 0; i &lt; nodeList.getLength(); i++) {Node node = nodeList.item(i);if (node.getNodeType() == Node.ELEMENT_NODE) {Element element = (Element) node;System.out.println(element.getNodeName());NodeList name = element.getElementsByTagName("accessid");Element line = (Element) name.item(0);return getCharacterDataFromElement(line);}}} catch (Exception l_ex) {l_ex.printStackTrace();}return "";}public static String getCharacterDataFromElement(Element e) {Node child = e.getFirstChild();if (child instanceof CharacterData) {CharacterData cd = (CharacterData) child;return cd.getData();}return "";}/*** @param args*/public static void main(String[] args) {timestamp = Long.toString((long)System.currentTimeMillis()/1000);System.out.println("Timestamp; " + timestamp);String[] testparams = {userid, timestamp,username, pass};String secret = "GerwtYxxd34";String known_result = "153283f1909be96a23a3324b345098010320b0db1fd71a726bbad0ca3cfd67ff";String result = generate_token(testparams, secret);System.out.println("Token is: " + result);/*if (result.equals(known_result)) {System.out.println("Hashes match");} else {System.out.println("Hashes DO NOT match:");System.out.println(result);}*/String response = getAccessID(result);System.out.println("Parsing the XML String: "+ response);String accessId = parseAccessId(response);System.out.println("Access ID: " + accessId);System.out.println ("URL: " + FORWARD_URL + accessId);}private static String username = "joe.NAME";private static String pass = "[email protected]";private static String userid = "joe.instructor";private static String timestamp = null;}

Ejemplo de PHP

/*** @param array $params* @param string $secret* @return string*/function generate_token(array $params, $secret) { $hashstorage = ''; foreach ($params as $param) { $hashstorage .= $secret.$param; } $result = hash('SHA256', $hashstorage); return $result;}$secret = 'GerwtYxxd34';$testparams = array( 'userid' =&gt; 'janedoe', 'timestamp' =&gt; '1326827023', 'username' =&gt; 'jdoe', 'pass' =&gt; 'pass');$known_result = '153283f1909be96a23a3324b345098010320b0db1fd71a726bbad0ca3cfd67ff';$result = generate_token($testparams, $secret);if ($result === $known_result) { echo 'Hashes match!'.PHP_EOL;} else { echo 'Hashes DO NOT match!'.PHP_EOL;}