Conceder acceso solo a través de la aplicación Azure AD
Al usar SharePoint Online puede definir las aplicaciones en Azure AD y estas aplicaciones pueden tener permisos en SharePoint, pero también para todos los demás servicios de Office 365. Este modelo es el modelo preferido en caso de que use SharePoint Online, si usa SharePoint local, debe usar el modelo solo de SharePoint a través de Azure ACS basado, como se describe aquí.
Importante
Con Azure ACS (Access Control Services) para SharePoint Online se ha retirado a partir del 27 de noviembre de 2023, consulte el anuncio de retirada completa para obtener más información. El uso de Azure ACS fuera del contexto de SharePoint ya se retiró el 7 de noviembre de 2018 y ya ha finalizado su vida útil.
La retirada significa que la característica no obtendrá inversiones nuevas, pero todavía se admite. El final del ciclo de vida significa que la característica se interrumpirá y ya no estará disponible para su uso.
Configuración de una aplicación de Azure AD para el acceso solo a la aplicación
En Azure AD al realizar solo la aplicación, normalmente se usa un certificado para solicitar acceso: cualquier persona que tenga el certificado y su clave privada puede usar la aplicación y los permisos concedidos a la aplicación. Los pasos siguientes le guiarán a través de la configuración de este modelo.
Ahora está listo para configurar la aplicación de Azure AD para invocar SharePoint Online con un token de acceso Solo aplicación. Para ello, debe crear y configurar un certificado X.509 autofirmado, que se usará para autenticar la aplicación en Azure AD, a la vez que se solicita el token de acceso Solo aplicación. En primer lugar, debe crear el certificado X.509 autofirmado, que se puede crear mediante la herramienta de makecert.exe que está disponible en Windows SDK, a través de un script de PowerShell proporcionado que no tiene una dependencia para makecert o con un comando de PowerShell PnP. El uso del script de PowerShell es el método preferido y se explica en este capítulo.
Importante
Es importante que ejecute los scripts siguientes con privilegios de administrador.
Para crear un certificado autofirmado con este script:
.\Create-SelfSignedCertificate.ps1 -CommonName "MyCompanyName" -StartDate 2017-10-01 -EndDate 2019-10-01
Nota:
Las fechas se proporcionan en formato de fecha ISO: AAAA-MM-dd
El algoritm de clave de certificado debe ser RSA, este es el único algoritmo admitido actualmente.
El script real se puede copiar desde aquí:
#Requires -RunAsAdministrator
<#
.SYNOPSIS
Creates a Self Signed Certificate for use in server to server authentication
.DESCRIPTION
.EXAMPLE
PS C:\> .\Create-SelfSignedCertificate.ps1 -CommonName "MyCert" -StartDate 2015-11-21 -EndDate 2017-11-21
This will create a new self signed certificate with the common name "CN=MyCert". During creation you will be asked to provide a password to protect the private key.
.EXAMPLE
PS C:\> .\Create-SelfSignedCertificate.ps1 -CommonName "MyCert" -StartDate 2015-11-21 -EndDate 2017-11-21 -Password (ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force)
This will create a new self signed certificate with the common name "CN=MyCert". The password as specified in the Password parameter will be used to protect the private key
.EXAMPLE
PS C:\> .\Create-SelfSignedCertificate.ps1 -CommonName "MyCert" -StartDate 2015-11-21 -EndDate 2017-11-21 -Force
This will create a new self signed certificate with the common name "CN=MyCert". During creation you will be asked to provide a password to protect the private key. If there is already a certificate with the common name you specified, it will be removed first.
#>
Param(
[Parameter(Mandatory=$true)]
[string]$CommonName,
[Parameter(Mandatory=$true)]
[DateTime]$StartDate,
[Parameter(Mandatory=$true)]
[DateTime]$EndDate,
[Parameter(Mandatory=$false, HelpMessage="Will overwrite existing certificates")]
[Switch]$Force,
[Parameter(Mandatory=$false)]
[SecureString]$Password
)
# DO NOT MODIFY BELOW
function CreateSelfSignedCertificate(){
#Remove and existing certificates with the same common name from personal and root stores
#Need to be very wary of this as could break something
if($CommonName.ToLower().StartsWith("cn="))
{
# Remove CN from common name
$CommonName = $CommonName.Substring(3)
}
$certs = Get-ChildItem -Path Cert:\LocalMachine\my | Where-Object{$_.Subject -eq "CN=$CommonName"}
if($certs -ne $null -and $certs.Length -gt 0)
{
if($Force)
{
foreach($c in $certs)
{
remove-item $c.PSPath
}
} else {
Write-Host -ForegroundColor Red "One or more certificates with the same common name (CN=$CommonName) are already located in the local certificate store. Use -Force to remove them";
return $false
}
}
$name = new-object -com "X509Enrollment.CX500DistinguishedName.1"
$name.Encode("CN=$CommonName", 0)
$key = new-object -com "X509Enrollment.CX509PrivateKey.1"
$key.ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
$key.KeySpec = 1
$key.Length = 2048
$key.SecurityDescriptor = "D:PAI(A;;0xd01f01ff;;;SY)(A;;0xd01f01ff;;;BA)(A;;0x80120089;;;NS)"
$key.MachineContext = 1
$key.ExportPolicy = 1 # This is required to allow the private key to be exported
$key.Create()
$serverauthoid = new-object -com "X509Enrollment.CObjectId.1"
$serverauthoid.InitializeFromValue("1.3.6.1.5.5.7.3.1") # Server Authentication
$ekuoids = new-object -com "X509Enrollment.CObjectIds.1"
$ekuoids.add($serverauthoid)
$ekuext = new-object -com "X509Enrollment.CX509ExtensionEnhancedKeyUsage.1"
$ekuext.InitializeEncode($ekuoids)
$cert = new-object -com "X509Enrollment.CX509CertificateRequestCertificate.1"
$cert.InitializeFromPrivateKey(2, $key, "")
$cert.Subject = $name
$cert.Issuer = $cert.Subject
$cert.NotBefore = $StartDate
$cert.NotAfter = $EndDate
$cert.X509Extensions.Add($ekuext)
$cert.Encode()
$enrollment = new-object -com "X509Enrollment.CX509Enrollment.1"
$enrollment.InitializeFromRequest($cert)
$certdata = $enrollment.CreateRequest(0)
$enrollment.InstallResponse(2, $certdata, 0, "")
return $true
}
function ExportPFXFile()
{
if($CommonName.ToLower().StartsWith("cn="))
{
# Remove CN from common name
$CommonName = $CommonName.Substring(3)
}
if($Password -eq $null)
{
$Password = Read-Host -Prompt "Enter Password to protect private key" -AsSecureString
}
$cert = Get-ChildItem -Path Cert:\LocalMachine\my | where-object{$_.Subject -eq "CN=$CommonName"}
Export-PfxCertificate -Cert $cert -Password $Password -FilePath "$($CommonName).pfx"
Export-Certificate -Cert $cert -Type CERT -FilePath "$CommonName.cer"
}
function RemoveCertsFromStore()
{
# Once the certificates have been been exported we can safely remove them from the store
if($CommonName.ToLower().StartsWith("cn="))
{
# Remove CN from common name
$CommonName = $CommonName.Substring(3)
}
$certs = Get-ChildItem -Path Cert:\LocalMachine\my | Where-Object{$_.Subject -eq "CN=$CommonName"}
foreach($c in $certs)
{
remove-item $c.PSPath
}
}
if(CreateSelfSignedCertificate)
{
ExportPFXFile
RemoveCertsFromStore
}
Se le pedirá que proporcione una contraseña para cifrar la clave privada y tanto . Archivo PFX y . El archivo CER se exportará a la carpeta actual.
Nota:
El certificado autofirmado también se puede generar mediante el comando New-PnPAzureCertificate .
El siguiente paso es registrar una aplicación de Azure AD en el inquilino de Azure Active Directory vinculado al inquilino de Office 365. Para ello, abra el Centro de Office 365 Admin (https://admin.microsoft.com) con la cuenta de un usuario miembro del grupo Administradores globales de inquilinos. Haga clic en el vínculo "Azure Active Directory" que está disponible en el grupo "centros de Administración" en la vista de árbol del lado izquierdo del Centro de Office 365 Admin. En la pestaña del nuevo explorador que se abrirá encontrará el Azure Portal de Microsoft. Si es la primera vez que accede a la Azure Portal con su cuenta, tendrá que registrar una nueva suscripción de Azure, proporcionando cierta información y una tarjeta de crédito para cualquier necesidad de pago. Pero no se preocupe, para jugar con Azure AD y registrar una aplicación de Office 365 no pagará nada. De hecho, son funcionalidades gratuitas. Una vez que tenga acceso a la Azure Portal, seleccione la sección "Azure Active Directory" y elija la opción "Registros de aplicaciones". Consulte la ilustración siguiente para obtener más detalles.
En la pestaña "Registros de aplicaciones" encontrará la lista de aplicaciones de Azure AD registradas en el inquilino. Haga clic en el botón "Nuevo registro" en la parte superior izquierda de la hoja. A continuación, proporcione un nombre para la aplicación y haga clic en "Registrar" en la parte inferior de la hoja.
Importante
Una vez creada la aplicación, copie el "Identificador de aplicación (cliente) ", ya que lo necesitará más adelante.
Ahora haga clic en "Permisos de API" en la barra de menús de la izquierda y haga clic en el botón "Agregar un permiso". Aparecerá una nueva hoja. Aquí elegirá los permisos que concederá a esta aplicación. Elija, por ejemplo:
- SharePoint
- Permisos de la aplicación
- Sitios
- Sites.FullControl.All
- Sitios
- Permisos de la aplicación
Haga clic en el botón azul "Agregar permisos" en la parte inferior para agregar los permisos a la aplicación. Los "permisos de aplicación" son los que se conceden a la aplicación cuando se ejecutan como Solo aplicación.
El paso final es "conectar" el certificado que creamos anteriormente a la aplicación. Haga clic en "Certificados & secretos" en la barra de menús de la izquierda. Haga clic en el botón "Cargar certificado", seleccione . Archivo CER que generó anteriormente y haga clic en "Agregar" para cargarlo.
Para confirmar que el certificado se registró correctamente, haga clic en "Manifiesto" en la barra de menús de la izquierda. Busque la propiedad keyCredentials . Debería tener el siguiente aspecto:
"keyCredentials": [
{
"customKeyIdentifier": "<$base64CertHash>",
"endDate": "2021-05-01T00:00:00Z",
"keyId": "<$guid>",
"startDate": "2019-05-01T00:00:00Z",
"type": "AsymmetricX509Cert",
"usage": "Verify",
"value": "<$base64Cert>",
"displayName": "CN=<$name of your cert>"
}
],
Si ve una sección similar a esta, el certificado se ha agregado correctamente.
En este ejemplo, el permiso de aplicación Sites.FullControl.All requiere el consentimiento del administrador en un inquilino para poder usarlo. Para ello, haga clic de nuevo en "Permisos de API" en el menú izquierdo. En la parte inferior verá una sección "Conceder consentimiento". Haga clic en el botón "Conceder consentimiento de administrador para {{nombre de la organización}}" y confirme la acción haciendo clic en el botón "Sí" que aparece en la parte superior.
Uso de esta entidad de seguridad con PowerShell de PnP
Si desea usar esta entidad de seguridad de solo aplicación de AAD con PowerShell PnP, después de instalar el módulo de PowerShell PnP, puede conectarse a su entorno de SharePoint Online mediante:
Connect-PnPOnline -ClientId <$application client id as copied over from the AAD app registration above> -CertificatePath '<$path to the PFX file generated by the PowerShell script above>' -CertificatePassword (ConvertTo-SecureString -AsPlainText "<$password assigned to the generated certificate pair above>" -Force) -Url https://<$yourtenant>.sharepoint.com -Tenant "<$tenantname>.onmicrosoft.com"
Ahora puede realizar operaciones a través de PowerShell PnP en el entorno de SharePoint Online mediante esta confianza de solo aplicación de certificado.
Nota:
PnP PowerShell es una solución de código abierto con una comunidad activa que ofrece su soporte. No hay ningún contrato de nivel de servicio para el soporte de la herramienta de código abierto de Microsoft.
Uso de esta entidad de seguridad en la aplicación mediante la biblioteca de SharePoint PnP Framework
En un primer paso, agregue el paquete NuGet de la biblioteca de PnP Framework: https://www.nuget.org/packages/PnP.Framework.
Una vez hecho esto, puede usar la siguiente construcción de código:
using PnP.Framework;
using System;
namespace AzureADCertAuth
{
class Program
{
static void Main(string[] args)
{
var authManager = new AuthenticationManager("<application id>", "c:\\temp\\mycert.pfx", "<password>", "contoso.onmicrosoft.com");
using (var cc = authManager.GetContext("https://contoso.sharepoint.com/sites/demo"))
{
cc.Load(cc.Web, p => p.Title);
cc.ExecuteQuery();
Console.WriteLine(cc.Web.Title);
};
}
}
}
Nota:
PnP Framework es una solución de código abierto con una comunidad activa que proporciona soporte técnico para ella. No hay ningún contrato de nivel de servicio para el soporte de la herramienta de código abierto de Microsoft.
Uso de esta entidad de seguridad en el script de PowerShell mediante la biblioteca de PnP Framework
Al usar Azure Automation Runbooks, agregue primero el certificado (.pfx) mediante la opción Certificados (en Recursos compartidos) y, a continuación, use el cmdlet Get-AutomationCertificate para recuperar el certificado que se usará en el script.
Nota:
Primero debe agregar el módulo PnP.Framework a la cuenta de Automation. Este módulo contiene todo lo necesario para realizar la llamada de autenticación.
# path to installed modules
$path = "C:\Modules\User\SharePointPnPPowerShellOnline"
# reference to needed assemblies
Add-Type -Path "$path\Microsoft.SharePoint.Client.dll"
Add-Type -Path "$path\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "$path\PnP.Framework.dll"
Add-Type -Path "$path\PnP.Core.dll"
Add-Type -Path "$path\Microsoft.Identity.Client.dll"
# reference to the certificate
$cert = Get-AutomationCertificate -Name 'NameOfCertificate'
# set the variables
$siteUrl = "https://<tenant>.sharepoint.com"
$appId = "<guid of the App>"
$domain = "<tenant>.onmicrosoft.com"
$azureEnv = [PnP.Framework.AzureEnvironment]::Production
try {
# instantiate the object
$clientContext = $null
$authManager = new-object PnP.Framework.AuthenticationManager($appId, $cert, $domain, $null, $azureEnv)
# configure the object
$clientContext = $authManager.GetContext($siteUrl)
# do some stuff
$clientContext.Load($clientContext.Web)
$clientContext.ExecuteQuery()
$clientContext.Web.Title
}
catch {
# catch error if needed
}
finally {
$clientContext.Dispose()
}
Uso de esta entidad de seguridad en la aplicación y uso de Azure KeyVault para almacenar el certificado y recuperarlo mediante una función de Azure
Agregue una identidad administrada a la función de Azure y conceda a esta identidad acceso (permiso GET en secretos) a KeyVault.
A continuación, hay una llamada ligeramente diferente al mismo método AuthenticationManager donde se pasa un certificado real en lugar de una ruta de acceso al certificado. Se agrega una función adicional para recuperar el certificado de KeyVault mediante la identidad administrada de la función de Azure, esta recuperación es perfecta y transparente, ya que la "magia" se produce en DefaultAzureCredential.
En este ejemplo se usan dos bibliotecas para acceder al Key Vault:
- Azure.Identity para autenticarse en el Key Vault
- Azure.Security.KeyVault.Secrets para obtener el certificado
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Microsoft.SharePoint.Client;
using System.Security.Cryptography.X509Certificates;
using (var cc = new PnP.Framework.AuthenticationManager(
"<application id>",
GetKeyVaultCertificate("kv-spo", "AzureAutomationSPOAccess"),
"contoso.onmicrosoft.com").GetContext("https://contoso.sharepoint.com/sites/demo"))
{
cc.Load(cc.Web, p => p.Title);
cc.ExecuteQuery();
log.Info("Via PnP, we have site: " + cc.Web.Title);
};
static X509Certificate2 GetKeyVaultCertificate(string keyvaultName, string name)
{
// Some steps need to be taken to make this work
// 1. Create a KeyVault and upload the certificate
// 2. Give the Function App the permission to GET certificates via Access Policies in the KeyVault
// 3. Call an explicit access token request to the management resource to https://vault.azure.net and use the URL of our Keyvault in the GetSecret method
Uri keyVaultUri = new Uri($"https://{keyvaultName}.vault.azure.net/");
var client = new SecretClient(keyVaultUri, new DefaultAzureCredential());
KeyVaultSecret secret = client.GetSecret(name);
return new X509Certificate2(Convert.FromBase64String(secret.Value), string.Empty, X509KeyStorageFlags.MachineKeySet);
}
Uso de esta entidad de seguridad con el analizador de modernización de Pnp
Ahora que ha creado el registro de aplicaciones de Azure Active Directory, siga estos pasos para usar esta entidad de seguridad con la herramienta.
preguntas más frecuentes
¿Puedo usar otros medios además de certificados para realizar el acceso solo a la aplicación para mi aplicación de Azure AD?
No, Todas las demás opciones están bloqueadas por SharePoint Online y dará lugar a un mensaje de acceso denegado.