Desarrollo de la aplicación

Importante

Las versiones del SDK de Microsoft Rights Management Service publicadas antes de marzo de 2020 están en desuso; Las aplicaciones que usan versiones anteriores deben actualizarse para usar la versión de marzo de 2020. Para ver los detalles completos, consulte el aviso de obsolescencia.

No se planea ninguna mejora adicional para el SDK de Microsoft Rights Management Service. Se recomienda encarecidamente la adopción del SDK de Microsoft Information Protection para los servicios de clasificación, etiquetado y protección.

En este ejemplo, va a compilar una aplicación de consola sencilla que interactúa con el servicio Azure Information Protection (AIP). Tomará como entrada la ruta de acceso de un documento para protegerla y, a continuación, la protegerá con una directiva ad hoc o una plantilla de Azure. A continuación, la aplicación aplicará las directivas correctas según las entradas, creando un documento protegido con información. El código de ejemplo que va a usar es la aplicación de prueba de Azure IP y está en GitHub.

Requisitos previos de la aplicación de ejemplo

  • Sistema operativo: Windows 10, Windows 8, Windows 7, Windows Server 2008, Windows Server 2008 R2 o Windows Server 2012
  • Lenguaje de programación: C# (.NET Framework 3.0 y versiones posteriores)
  • Entorno de desarrollo: Visual Studio 2015 (y versiones posteriores)

Configuración de la configuración de Azure

La configuración de Azure para esta aplicación requiere crear un ID de inquilino, una clave simétrica y un ID de principal de aplicación.

Configuración del inquilino de Azure AD

Para configurar el entorno de Azure AD para Azure Information Protection, siga las instrucciones de Activación del servicio de protección desde Azure Information Protection.

Una vez activado el servicio, necesitará componentes de PowerShell para los pasos siguientes. Siga Administrar la protección de Azure Information Protection mediante PowerShell para lograrlo.

Obtención del identificador de inquilino

  • Como administrador, ejecute PowerShell.
  • Importe el módulo RMS: Import-Module AIPService
  • Conéctese al servicio con las credenciales de usuario asignadas: Connect-AipService –Verbose
  • Asegúrese de que RMS está habilitado: enable-aipservice
  • Para obtener el identificador de inquilino, ejecute: Get-AipServiceConfiguration

Registre el valor BPOSId (id. de inquilino). La necesitará en pasos posteriores.

Salida del ejemploSalida del cmdlet Get-AadrmConfiguration

  • Desconecte del servicio: Disconnect-AipServiceService

Creación de una entidad de servicio

Siga estos pasos para crear una entidad de servicio:

Una entidad de servicio es unas credenciales configuradas a nivel global para el control de acceso que permiten a un servicio autenticarse con Microsoft Azure AD y proteger la información mediante la Gestión de Derechos de Microsoft Azure AD.

  • Como administrador, ejecute PowerShell.
  • Importe el módulo de Microsoft Azure AD mediante: Import-Module MSOnline
  • Conéctese a su servicio en línea con las credenciales de usuario asignadas: Connect-MsolService
  • Cree una nueva entidad de servicio mediante la ejecución de: New-MsolServicePrincipal
  • Proporcione un nombre para la entidad de servicio.

    Registre la clave simétrica y el identificador principal de la aplicación para su uso futuro.

Salida del ejemploNewMsolServicePrincipal cmdlet outputSalida del cmdlet NewMsolServicePrincipal

  • Agregue el ID del principal de aplicación, la clave simétrica y el ID de inquilino al archivo App.config de la aplicación.

Archivo App.config de ejemploArchivo App.config de ejemplo

  • ClientID y RedirectUri estarán disponibles para usted desde el momento en que registró su aplicación en Azure. Para obtener más información sobre cómo registrar su aplicación en Azure y adquirir un ClientID y un RedirectUri, consulte Configurar Azure RMS para la autenticación de ADAL.

Resumen del diseño

En el diagrama siguiente se muestra un flujo de arquitectura y proceso para la aplicación que está creando, pasos que se describen a continuación. resumen de diseño

  1. Las entradas del usuario:
    • Ruta de acceso del archivo que se va a proteger
    • Selecciona una plantilla o crea una directiva ad hoc.
  2. La aplicación solicita autenticación con AIP.
  3. AIP confirma la autenticación
  4. La aplicación solicita plantillas de AIP.
  5. AIP devuelve plantillas predefinidas.
  6. La aplicación busca el archivo especificado con una ubicación determinada.
  7. La aplicación aplica la directiva de protección de AIP al archivo.

Funcionamiento del código

En el ejemplo, Prueba de IP de Azure, la solución comienza con el archivo Iprotect.cs. Se trata de una aplicación de consola de C# y, al igual que con cualquier otra aplicación habilitada para AIP, comienzas cargando el MSIPC.dll como se muestra en el método.

//Loads MSIPC.dll
SafeNativeMethods.IpcInitialize();
SafeNativeMethods.IpcSetAPIMode(APIMode.Server);

Carga de los parámetros necesarios para conectarse a Azure

//Loads credentials for the service principal from App.Config
SymmetricKeyCredential symmetricKeyCred = new SymmetricKeyCredential();
symmetricKeyCred.AppPrincipalId = ConfigurationManager.AppSettings["AppPrincipalId"];
symmetricKeyCred.Base64Key = ConfigurationManager.AppSettings["Base64Key"];
symmetricKeyCred.BposTenantId = ConfigurationManager.AppSettings["BposTenantId"];

Al proporcionar la ruta de acceso del archivo en la aplicación de consola, la aplicación comprueba si el documento ya está cifrado. El método es de la clase SafeFileApiNativeMethods .

var checkEncryptionStatus = SafeFileApiNativeMethods.IpcfIsFileEncrypted(filePath);

Si el documento no está cifrado, procede a cifrarlo con la selección proporcionada en la indicación.

if (!checkEncryptionStatus.ToString().ToLower().Contains(alreadyEncrypted))
{
  if (method == EncryptionMethod1)
  {
    //Encrypt a file via AIP template
    ProtectWithTemplate(symmetricKeyCred, filePath);

  }
  else if (method == EncryptionMethod2)
  {
    //Encrypt a file using ad-hoc policy
    ProtectWithAdHocPolicy(symmetricKeyCred, filePath);
  }
}

La opción proteger con plantilla procede a obtener la lista de plantillas del servidor y ofrece al usuario la opción de seleccionar.

Si no modificó plantillas, obtendrá plantillas predeterminadas de AIP.

public static void ProtectWithTemplate(SymmetricKeyCredential symmetricKeyCredential, string filePath)
{
  // Gets the available templates for this tenant
  Collection<TemplateInfo> templates = SafeNativeMethods.IpcGetTemplateList(null, false, true,
      false, true, null, null, symmetricKeyCredential);

  //Requests tenant template to use for encryption
  Console.WriteLine("Please select the template you would like to use to encrypt the file.");

  //Outputs templates available for selection
  int counter = 0;
  for (int i = 0; i < templates.Count; i++)
  {
    counter++;
    Console.WriteLine(counter + ". " + templates.ElementAt(i).Name + "\n" +
        templates.ElementAt(i).Description);
  }

  //Parses template selection
  string input = Console.ReadLine();
  int templateSelection;
  bool parseResult = Int32.TryParse(input, out templateSelection);

  //Returns error if no template selection is entered
  if (parseResult)
  {
    //Ensures template value entered is valid
    if (0 < templateSelection && templateSelection <= counter)
    {
      templateSelection -= templateSelection;

      // Encrypts the file using the selected template
      TemplateInfo selectedTemplateInfo = templates.ElementAt(templateSelection);

      string encryptedFilePath = SafeFileApiNativeMethods.IpcfEncryptFile(filePath,
          selectedTemplateInfo.TemplateId,
          SafeFileApiNativeMethods.EncryptFlags.IPCF_EF_FLAG_KEY_NO_PERSIST, true, false, true, null,
          symmetricKeyCredential);
    }
  }
}

Si selecciona una directiva ad hoc, el usuario de la aplicación debe proporcionar correos electrónicos de las personas que tendrían derechos. En esta sección, la licencia se crea utilizando el método IpcCreateLicenseFromScratch() y aplicando la nueva política en la plantilla.

if (issuerDisplayName.Trim() != "")
{
  // Gets the available issuers of rights policy templates.
  // The available issuers is a list of RMS servers that this user has already contacted.
  try
  {
    Collection<TemplateIssuer> templateIssuers = SafeNativeMethods.IpcGetTemplateIssuerList(
                                                    null,
                                                    true,
                                                    false,
                                                    false, true, null, symmetricKeyCredential);

    // Creates the policy and associates the chosen user rights with it
    SafeInformationProtectionLicenseHandle handle = SafeNativeMethods.IpcCreateLicenseFromScratch(
                                                        templateIssuers.ElementAt(0));
    SafeNativeMethods.IpcSetLicenseOwner(handle, owner);
    SafeNativeMethods.IpcSetLicenseUserRightsList(handle, userRights);
    SafeNativeMethods.IpcSetLicenseDescriptor(handle, new TemplateInfo(null, CultureInfo.CurrentCulture,
                                                            policyName,
                                                            policyDescription,
                                                            issuerDisplayName,
                                                            false));

    //Encrypts the file using the ad hoc policy
    string encryptedFilePath = SafeFileApiNativeMethods.IpcfEncryptFile(
                                    filePath,
                                    handle,
                                    SafeFileApiNativeMethods.EncryptFlags.IPCF_EF_FLAG_KEY_NO_PERSIST,
                                    true,
                                    false,
                                    true,
                                    null,
                                    symmetricKeyCredential);
    }
}

Ejemplo de interacción del usuario

Una vez que se compila y se ejecuta todo, las salidas de la aplicación deben tener un aspecto similar al siguiente:

  1. Se le pedirá que seleccione un método de cifrado. salida de la aplicación - paso 1

  2. Se le pide que proporcione la ruta de acceso al archivo que se va a proteger. app output - step 2salida de la aplicación: paso 2

  3. Se le pedirá que escriba el correo electrónico del propietario de una licencia (este propietario debe tener privilegios de administrador global en el inquilino de Azure AD). app output - step 3salida de la aplicación: paso 3

  4. Escriba direcciones de correo electrónico de los usuarios que tendrán derechos para acceder al archivo (los correos electrónicos deben estar separados por espacios). app output - step 4salida de la aplicación: paso 4

  5. Seleccione de una lista de derechos que se van a conceder a los usuarios autorizados. salida de la aplicación - paso 5

  6. Por último, escriba algunos metadatos de directiva: nombre de directiva, descripción y nombre para mostrar del emisor (inquilino de Azure AD) app output - step 6salida de la aplicación: paso 6