Saltar al contenido principal
La configuración predeterminada de Office 365 incluye Active Directory y los servicios DirSync/Azure AD Sync, que sincronizan y aprovisionan usuarios de AD que residen en Azure AD para . En esta configuración, Auth0 es el y proporciona inicio de sesión único (SSO) para estos usuarios. Pero ¿qué sucede si desea permitir que contratistas, partners o incluso clientes accedan a su entorno de Office 365 (por ejemplo, SharePoint)? En ese caso, el enfoque predeterminado no es óptimo porque estos usuarios tendrían que crearse en su entorno de AD. En su lugar, debe aprovisionar usuarios de Azure AD de forma personalizada mediante Rules de Auth0. El aprovisionamiento personalizado le permite crear usuarios en Azure AD (y, en la práctica, en Office 365) justo cuando inician sesión desde cualquier conexión disponible en Auth0. (En este caso, la Rule asume la tarea de DirSync para cualquier tipo de conexión en el que DirSync no funcione). Esta configuración le permite ofrecer diversas opciones de inicio de sesión (incluidas Facebook, LinkedIn y Google Workspace) para su entorno de Office 365.

Requisitos previos

Antes de configurar el aprovisionamiento personalizado, debe:
  • Configurar Office 365: registrar un y configurar Office 365 como una aplicación de terceros en Auth0.

Configurar Azure AD

El aprovisionamiento personalizado usa la API de Azure AD Graph para aprovisionar nuevos usuarios en Azure AD. Para acceder a la API de Azure AD Graph, debe crear una aplicación dentro del Directory de Azure AD vinculado a la suscripción de Office 365:
  1. Inicie sesión en el Portal de Azure.
  2. Seleccione Azure Active Directory en el panel de navegación izquierdo.
  3. Seleccione App registrations en el nuevo menú.
  4. Haga clic en New application registration.
  5. Complete el formulario:
    1. Introduzca un nombre para la aplicación (como Auth0 Provisioning)
    2. Seleccione Web app / API como Application type.
    3. Introduzca una URL de inicio de sesión. Puede introducir cualquier URL válida; en realidad no se usará.
  6. La aplicación que acaba de crear aparecerá en la lista App registrations. Selecciónela.
  7. En la hoja Settings (Microsoft llama a estas secciones “blades”), seleccione Keys.
  8. Introduzca una Description (como Auth0 Provision) y elija una Duration para la nueva clave. Si decide emitir una clave no permanente, tome nota de la fecha de vencimiento y cree un recordatorio para sustituirla por una nueva antes de que expire.
  9. Haga clic para guardar la clave y, a continuación, copie la App Key. Esta clave solo se mostrará una vez y es necesaria para la Rule de Auth0.
  10. Seleccione Required permissions y haga clic en Add en la nueva hoja.
  11. Seleccione la API de Microsoft Graph y, a continuación, marque Read and write directory data en Application Permissions.
  12. De nuevo en Required permissions, haga clic en el botón Grant Permissions y, a continuación, haga clic en Yes para conceder los permisos solicitados.

Crear la Rule de aprovisionamiento de Azure AD

La siguiente Rule muestra el proceso de aprovisionamiento:
  1. Si el usuario proviene de la conexión de AD, omita el proceso de aprovisionamiento (porque DirSync se encargará de ello).
  2. Si el usuario ya fue aprovisionado en Azure AD, simplemente continúe con la transacción de inicio de sesión.
  3. Use el ID de cliente y la clave de Azure AD para obtener un Token de acceso para la Graph API.
  4. Cree un usuario en Azure AD.
  5. Asigne una licencia al usuario.
  6. Continúe con la transacción de inicio de sesión.
El nombre de usuario se genera con la función createAzureADUser, que, de forma predeterminada, genera un nombre de usuario con el formato auth0-c3fb6eec-3afd-4d52-8e0a-d9f357dd19ab@fabrikamcorp.be. Puede cambiarlo por el que desee; solo asegúrese de que este valor sea único para todos sus usuarios. Asegúrese de establecer los valores correctos para AUTH0_OFFICE365_CLIENT_ID, AAD_CUSTOM_DOMAIN, AAD_DOMAIN, AAD_APPLICATION_ID y AAD_APPLICATION_API_KEY en su objeto de configuración para que estén disponibles en el código de su Rule. Para obtener más información, lea Store Configuration for Rules. En el código, también verá que la Rule esperará unos 15 segundos después de aprovisionar al usuario. Esto se debe a que pasan unos segundos antes de que el usuario aprovisionado esté disponible para Office 365.
function (user, context, callback) {
  // Importar los paquetes de Node.js que vamos a utilizar.
  // Consultar este sitio web para obtener una lista completa de los paquetes disponibles:
  // https://auth0-extensions.github.io/canirequire/
  var rp = require('request-promise');
  var uuidv4 = require('uuid');

  // El nombre de tu conexión de Active Directory (si utilizas una)
  var AUTH0_AD_CONNECTION = 'Travel0AD';
  // El client_id de tu integración SSO de Office 365
  // Puedes obtenerlo desde la URL al editar la integración SSO,
  // tendrá el siguiente formato:
  // https://manage.auth0.com/#/externalapps/{the_client_id}/settings
  var AUTH0_OFFICE365_CLIENT_ID = configuration.AUTH0_OFFICE365_CLIENT_ID;
  // El dominio principal de nuestra empresa.
  var YOUR_COMPANY_DOMAIN = 'mycompanyurl.com';
  // Tu dominio de Azure AD.
  var AAD_DOMAIN = configuration.AAD_DOMAIN;
  // El ID de aplicación generado al crear la aplicación de Azure AD.
  var AAD_APPLICATION_ID = configuration.AAD_APPLICATION_ID;
  // La clave de API generada para la aplicación de Azure AD.
  var AAD_APPLICATION_API_KEY = configuration.AAD_APPLICATION_API_KEY;
  // La ubicación de los usuarios que van a acceder a los productos de Microsoft.
  var AAD_USAGE_LOCATION = 'US';
  // Azure AD no reconoce al usuario de inmediato, necesita unos segundos
  var AAD_USER_CREATE_DELAY = 15000;
  // La clave que representa la licencia que queremos asignar al nuevo usuario.
  // Consultar la siguiente URL para obtener una lista de las licencias disponibles:
  // https://gist.github.com/Lillecarl/3c4727e6dcd1334467e0
  var OFFICE365_KEY = 'O365_BUSINESS';

  // Ejecutar este Rule únicamente para la integración SSO de Office 365.
  if (context.clientID !== AUTH0_OFFICE365_CLIENT_ID) {
    return callback(null, user, context);
  }

  // Omitir el aprovisionamiento personalizado para usuarios de AD.
  if (context.connection === AUTH0_AD_CONNECTION) {
    return callback(null, user, context);
  }

  // Si el usuario ya está aprovisionado en Microsoft AD, omitimos
  // el resto de este Rule
  user.app_metadata = user.app_metadata || {};
  if (user.app_metadata.office365Provisioned) {
    return connectWithUser();
  }

  // Variables globales que utilizaremos en los distintos pasos durante
  // el aprovisionamiento de un nuevo usuario.
  var token;
  var userPrincipalName;
  var mailNickname = user.email.split('@')[0];
  var uuid = uuidv4.v4();
  var immutableId = new Buffer(uuid).toString('base64');
  var userId;

  // Todos los pasos realizados para aprovisionar nuevos usuarios de Microsoft AD.
  // La definición de cada función se encuentra a continuación.
  getAzureADToken()
    .then(createAzureADUser)
    .then(getAvailableLicenses)
    .then(assignOffice365License)
    .then(saveUserMetadata)
    .then(waitCreateDelay)
    .then(connectWithUser)
    .catch(callback);

  // Solicita un token de acceso para interactuar con la API de Windows Graph.
  function getAzureADToken() {
    var options = {
      method: 'POST',
      url: 'https://login.windows.net/' + AAD_DOMAIN + '/oauth2/token?api-version=1.5',
      headers: {
        'Content-type': 'application/json',
        },
      json: true,
      form: {
        client_id: AAD_APPLICATION_ID,
        client_secret: AAD_APPLICATION_API_KEY,
        grant_type: 'client_credentials',
        resource: 'https://graph.windows.net'
      },
    };

    return rp(options);
  }

  // Obtiene el token de acceso solicitado anteriormente y construye una nueva solicitud
  // para aprovisionar el nuevo usuario de Microsoft AD.
  function createAzureADUser(response) {
    token = response.access_token;
    userPrincipalName = 'auth0-' + uuid + '@' + YOUR_COMPANY_DOMAIN;

    var options = {
      url: 'https://graph.windows.net/' + AAD_DOMAIN + '/users?api-version=1.6',
      headers: {
        'Content-type': 'application/json',
        'Authorization': 'Bearer ' + token
      },
      json: true,
      body: {
        accountEnabled: true,
        displayName: user.nickname,
        mailNickname: mailNickname,
        userPrincipalName: userPrincipalName,
        passwordProfile: {
          password: immutableId,
          forceChangePasswordNextLogin: false
        },
        immutableId: immutableId,
        usageLocation: AAD_USAGE_LOCATION
      },
    };

    return rp(options);
  }

  // Tras aprovisionar al usuario, se realiza una solicitud para obtener la lista
  // de licencias de productos de Microsoft disponibles.
  function getAvailableLicenses(response) {
    userId = response.objectId;
    var options = {
      url: 'https://graph.windows.net/' + AAD_DOMAIN + '/subscribedSkus?api-version=1.6',
      json: true,
      headers: {
        'Content-type': 'application/json',
        'Authorization': 'Bearer ' + token
      }
    };
    return rp(options);
  }

  // Con la lista de licencias, iteramos sobre ella para obtener el id (skuId) de la
  // licencia que queremos asignar al nuevo usuario (Office 365 en este caso).
  // También se realiza una nueva solicitud a la API de Graph para vincular al usuario
  // con la licencia.
  function assignOffice365License(response) {
    var office365License;

    for (var i = 0; i < response.value.length; i++) {
      if (response.value[i].skuPartNumber === OFFICE365_KEY) {
        office365License = response.value[i].skuId;
        break;
      }
    }

    var options = {
      url: ' https://graph.windows.net/' + AAD_DOMAIN + '/users/' + userId + '/assignLicense?api-version=1.6',
      headers: {
        'Content-type': 'application/json',
        'Authorization': 'Bearer ' + token
      },
      json: true,
      body: {
        'addLicenses': [
          {
            'disabledPlans': [],
            'skuId': office365License
          }
        ],
        'removeLicenses': []
      }
    };
    return rp(options);
  }

  // Tras aprovisionar al usuario y asignarle una licencia, registramos
  // (en Auth0) que este usuario de Google Workspace ya ha sido aprovisionado.
  // También registramos el username principal del usuario y el immutableId para
  // redirigirlo correctamente en futuros inicios de sesión.
  function saveUserMetadata() {
    user.app_metadata = user.app_metadata || {};

    user.app_metadata.office365Provisioned = true;
    user.app_metadata.office365UPN = userPrincipalName;
    user.app_metadata.office365ImmutableId = immutableId;

    return auth0.users.updateAppMetadata(user.user_id, user.app_metadata);
  }

  // Como se mencionó, la API de Windows Graph necesita aproximadamente 10 segundos para
  // finalizar el aprovisionamiento de nuevos usuarios (aunque devuelve ok de inmediato)
  function waitCreateDelay() {
    return new Promise(function (resolve) {
      setTimeout(function() {
        resolve();
      }, AAD_USER_CREATE_DELAY);
    });
  }

  // Agrega el username principal y el immutableId al objeto de usuario y finaliza
  // el Rule.
  function connectWithUser() {
    user.upn = user.app_metadata.office365UPN;
    user.inmutableid = user.app_metadata.office365ImmutableId;
      return callback(null, user, context);
  }
}
Este código muestra el proceso de aprovisionamiento de un nuevo usuario, pero también puedes adaptarlo para sincronizar los metadatos de usuarios existentes.

Experiencia de usuario

La forma más sencilla de que sus usuarios externos se autentiquen es mediante el inicio de sesión iniciado desde el Proveedor de identidad. Debe redirigir a sus usuarios a la siguiente URL (por ejemplo, usando un “enlace inteligente” como https://office.travel0.com): Esto les mostrará la página de inicio de sesión de Auth0, tras lo cual se les redirigirá a Office 365. Es importante explicarles a los usuarios externos que esta es la única forma en que pueden autenticarse, ya que la página de inicio de sesión de Office 365 no admite Home Realm Discover para estos usuarios externos. Esto también significa que, cuando intenten abrir un enlace, primero deberán visitar el enlace inteligente antes de poder acceder al enlace que intentaron abrir. En este ejemplo, Travel0 habilitó algunas cuentas de redes sociales y una conexión de base de datos para su aplicación de terceros de Office 365 en Auth0.

Deep linking

Algunas implementaciones pueden requerir deep linking (por ejemplo, con SharePoint Online). En este caso, debe construirse un enlace inteligente que comience en la página de inicio de sesión de Office 365:
https://login.microsoftonline.com/login.srf?wa=wsignin1.0&whr={yourCustomDomain}&wreply={deepLink}
El primer parámetro, {yourCustomDomain}, debe ser el dominio que configuraste en Azure AD para el (por ejemplo, travel0.com). Al especificarlo como whr, Azure AD sabrá que debe redirigir a Auth0 en lugar de mostrar la página de inicio de sesión. El parámetro DEEP_LINK debe ser una URL codificada dentro de Office 365 (por ejemplo, una página de SharePoint Online o Exchange). URL de ejemplo:
https://login.microsoftonline.com/login.srf?wa=wsignin1.0&whr=travel0.com&wreply=https%3A%2F%2Ftravel0%2Esharepoint%2Ecom