Reemplazar un secreto de cliente a punto de expirar en un complemento de SharePoint

Los secretos de cliente de complementos de SharePoint registrados con la página AppRegNew.aspx expiran en un año. En este artículo se explica cómo agregar un nuevo secreto para un complemento, así como el proceso para agregar un nuevo secreto de cliente que sea válido durante tres años.

Nota:

Este artículo trata sobre los complementos de SharePoint que se distribuyen a través del catálogo de una organización y se registran con la página AppRegNew.aspx. Si el complemento está registrado en el Panel de vendedores, vea Crear o actualizar identificadores y claves secretas de cliente en el Panel de vendedores.

Se recomienda crear nuevos secretos un mínimo de 30 días antes de que expiren. Esto le proporciona un mes de tiempo antes de que expiren las credenciales antiguas.

Se recomienda quitar solo los secretos un mínimo de 7 días después de la expiración, siempre que los haya quitado de la configuración de la aplicación.

Si quita un secreto expirado de ACS antes de quitarlo de la configuración de la aplicación, se producirán errores.

Requisitos previos

Antes de empezar, asegúrese de que:

  • Microsoft Online Services - Ayudante para el inicio de sesión está instalado en el equipo de desarrollo.
  • Puede conectarse a Office 365 con PowerShell: Conectarse a PowerShell de Office 365
  • Es un administrador de inquilinos del inquilino de Office 365 (o administrador de la granja de servidores en la granja de servidores) donde se registró el complemento con la página AppRegNew.aspx.

Buscar las fechas de expiración del Complementos de SharePoint instalado en el arrendamiento de Office 365

  1. Abra Windows PowerShell y ejecute el siguiente cmdlet:

    Connect-MsolService
    
  2. En la pantalla de inicio de sesión, especifique las credenciales del administrador de espacios empresariales (o de granjas) del espacio empresarial o la granja de Office 365 donde se registró el complemento con AppRegNew.aspx.

  3. Cree un informe donde figure cada complemento y la fecha en que expira su secreto con las siguientes líneas. Cosas que debe saber sobre este código:

    • Primero filtra las propias aplicaciones de Microsoft y los complementos que aún se están desarrollando (y un tipo de complemento en desuso que se llamaba "complemento autohospedado").
    • Del resto, filtra los complementos que no son de SharePoint y los que usan claves asimétricas, como flujos de trabajo.
    $applist = Get-MsolServicePrincipal -all  |Where-Object -FilterScript { ($_.DisplayName -notlike "*Microsoft*") -and ($_.DisplayName -notlike "autohost*") -and  ($_.ServicePrincipalNames -notlike "*localhost*") }
    
    foreach ($appentry in $applist) {
        $principalId = $appentry.AppPrincipalId
    
        Get-MsolServicePrincipalCredential -AppPrincipalId $principalId -ReturnKeyValues $false | Where-Object { $_.Type -eq "Password" } | ForEach-Object {
            [PSCustomObject][Ordered]@{
                PrincipalName = $appentry.DisplayName
                PrincipalId = $principalId
                KeyID = $_.KeyId
                StartDate = $_.StartDate
                EndDate = $_.EndDate
            } | Export-Csv -Path C:\temp\appsec.csv -NoTypeInformation -Delimiter ';' -Append
        }
    }
    
  4. Abra el archivo C:\temp\appsec.csv para ver el informe. Deje la ventana de Windows PowerShell abierta para el siguiente procedimiento, si alguno de los secretos está próximo a expirar.

Generar un nuevo secreto

  1. Cree una variable de identificador de cliente con la siguiente línea usando el identificador de cliente de la Complemento de SharePoint como parámetro.

    $clientId = 'client id of the add-in'
    
  2. Genere un nuevo secreto de cliente con las siguientes líneas:

    $bytes = New-Object Byte[] 32
    $rand = [System.Security.Cryptography.RandomNumberGenerator]::Create()
    $rand.GetBytes($bytes)
    $rand.Dispose()
    $newClientSecret = [System.Convert]::ToBase64String($bytes)
    $dtStart = [System.DateTime]::Now
    $dtEnd = $dtStart.AddYears(1)
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Symmetric -Usage Sign -Value $newClientSecret -StartDate $dtStart -EndDate $dtEnd
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Symmetric -Usage Verify -Value $newClientSecret -StartDate $dtStart -EndDate $dtEnd
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Password -Usage Verify -Value $newClientSecret -StartDate $dtStart -EndDate $dtEnd
    $newClientSecret
    
  3. El nuevo secreto de cliente aparecerá en la consola de Windows PowerShell. Cópielo en un archivo de texto. Lo usará en el procedimiento siguiente.

    Sugerencia

    De forma predeterminada, el secreto del complemento dura un año. Puede establecerlo en un periodo más corto o más largo incluyendo el parámetro -EndDate en las tres llamadas del cmdlet New-MsolServicePrincipalCredential.

Actualizar la aplicación web remota de Visual Studio para usar el nuevo secreto

Importante

Si el complemento se creó inicialmente con una versión preliminar de Microsoft Office Developer Tools para Visual Studio, puede contener una versión obsoleta del archivo TokenHelper.cs (o .vb). Si el archivo no contiene la cadena "secondaryClientSecret", está obsoleto y debe sustituirse para poder actualizar la aplicación web con un nuevo secreto. Para obtener una copia de una versión de lanzamiento del archivo, necesitará Visual Studio 2012 o posterior. Cree un proyecto de complemento de SharePoint en Visual Studio. Copie el archivo TokenHelper de este proyecto al proyecto de aplicación web del complemento de SharePoint.

  1. Abra el proyecto de Complemento de SharePoint en Visual Studio y el archivo web.config del proyecto de aplicación web. En la sección appSettings están las claves para el identificador y el secreto de cliente. A continuación puede ver un ejemplo:

    <appSettings>
      <add key="ClientId" value="your client id here" />
      <add key="ClientSecret" value="your old secret here" />
        ... other settings may be here ...
    </appSettings>
    
  2. Cambie el nombre de la clave ClientSecret por SecondaryClientSecret, tal y como se muestra en el ejemplo siguiente:

    <add key="SecondaryClientSecret" value="your old secret here" />
    

    Nota:

    Si realiza este procedimiento por primera vez, en este momento no habrá ninguna entrada de la propiedad SecondaryClientSecret en el archivo de configuración. Pero, si realiza el procedimiento para una expiración posterior (segunda o tercera) del secreto de cliente, la propiedad SecondaryClientSecret está presente y contiene el secreto inicial o el secreto antiguo ya expirado. En este caso, elimine la propiedad SecondaryClientSecret antes de cambiar el nombre de ClientSecret.

  3. Agregue una clave ClientSecret nueva y asígnele el nuevo secreto de cliente. Su marcado ahora debería tener este aspecto:

    <appSettings>
      <add key="ClientId" value="your client id here" />
      <add key="ClientSecret" value="your new secret here" />
      <add key="SecondaryClientSecret" value="your old secret here" />
        ... other settings may be here ...
    </appSettings>
    

    Importante

    No podrá usar el nuevo secreto de cliente generado hasta que expire el secreto de cliente actual. Por lo tanto, cambiar la clave ClientId al nuevo secreto de cliente sin la clave SecondaryClientSecret presente no funcionará. Debe seguir el procedimiento de este artículo y esperar a que expire el secreto de cliente anterior. Luego puede eliminar SecondaryClientSecret si quiere.

  4. Si cambió a un nuevo archivo TokenHelper, recompile el proyecto.

  5. Vuelva a publicar la aplicación web.

Crear un secreto de cliente válido durante tres años

En el caso de los secretos de cliente expirados, debe eliminar primero todos los secretos expirados de un elemento clientId concreto. Luego cree uno nuevo con el PowerShell de MSO, espere al menos 24 horas y pruebe la aplicación con el nuevo elemento clientId y la clave ClientSecret.

  1. Conéctese a MSOnline con el usuario administrador de espacios empresariales y el marcado siguiente mediante SharePoint Windows PowerShell.

    import-module MSOnline
    $msolcred = get-credential
    connect-msolservice -credential $msolcred
    
  2. Obtenga ServicePrincipals y las claves. Al imprimir $keys se devuelven tres registros. También verá el elemento EndDate de cada clave. Confirme que la clave expirada figure aquí.

    Nota:

    El elemento clientId debe coincidir con el clientId expirado. Se recomienda eliminar todas las claves de este clientId, tanto las expiradas como las no expiradas.

    $clientId = "27c5b286-62a6-45c7-beda-abbaea6eecf2"
    $keys = Get-MsolServicePrincipalCredential -AppPrincipalId $clientId
    $keys
    
  3. Elimine todas las claves cuando haya confirmado que también han caducado.

    Remove-MsolServicePrincipalCredential -KeyIds $keys.KeyId -AppPrincipalId $clientId
    
  4. Genere un nuevo ClientSecret para este clientID. Usa el mismo clientId que se ha establecido en el paso anterior. El nuevo ClientSecret es válido durante tres años.

    $bytes = New-Object Byte[] 32
    $rand = [System.Security.Cryptography.RandomNumberGenerator]::Create()
    $rand.GetBytes($bytes)
    $rand.Dispose()
    $newClientSecret = [System.Convert]::ToBase64String($bytes)
    $dtStart = [System.DateTime]::Now
    $dtEnd = $dtStart.AddYears(3)
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Symmetric -Usage Sign -Value $newClientSecret -StartDate $dtStart  -EndDate $dtEnd
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Symmetric -Usage Verify -Value $newClientSecret   -StartDate $dtStart  -EndDate $dtEnd
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Password -Usage Verify -Value $newClientSecret   -StartDate $dtStart  -EndDate $dtEnd
    $newClientSecret
    
  5. Copie la salida de $newClientSecret.

  6. Reemplace el elemento Web.config por estos ClientId y ClientSecret. La configuración de la aplicación de SecondaryClientSecret no es necesaria.

  7. Espere al menos 24 horas para propagar ClientSecret en SharePoint Office (SPO).

Ver también