Accorder l’accès uniquement via application Azure AD
Lorsque vous utilisez SharePoint Online, vous pouvez définir des applications dans Azure AD et ces applications peuvent se voir octroyées des autorisations dans SharePoint, mais aussi dans tous les autres services Office 365. Ce modèle est le modèle préféré au cas où vous utilisez SharePoint Online, si vous utilisez SharePoint en local, vous devez utiliser le modèle SharePoint Uniquement via Azure ACS basé comme décrit ici.
Important
Azure Access Control (ACS), un service de Azure Active Directory (Azure AD), a été retiré le 7 novembre 2018. Ce retrait n?a aucune incidence sur le mod?le de compl?ments SharePoint, qui utilise lehttps://accounts.accesscontrol.windows.net nom d?h?te (qui n?est pas affect? par ce retrait). Pour plus d’informations, voir Conséquences du retrait du contrôle d’accès Azure pour les compléments SharePoint.
Configuration d’une application Azure AD pour un accès application uniquement
Dans Azure AD, lorsque vous utilisez l’application uniquement, vous utilisez généralement un certificat pour demander l’accès : toute personne ayant le certificat et sa clé privée peut utiliser l’application et les autorisations accordées à l’application. Les étapes ci-dessous vous walk you through the setup of this model.
Vous êtes maintenant prêt à configurer l’application Azure AD pour l’SharePoint Online avec un jeton d’accès Application uniquement. Pour ce faire, vous devez créer et configurer un certificat X.509 auto-signé, qui sera utilisé pour authentifier votre application sur Azure AD, tout en demandant le jeton d’accès Application uniquement. Tout d’abord, vous devez créer le certificat X.509 auto-signé, qui peut être créé à l’aide de l’outil makecert.exe disponible dans le SDK Windows ou via un script PowerShell fourni qui ne dispose pas d’une dépendance à rendrecert. L’utilisation du script PowerShell est la méthode préférée et est expliquée dans ce chapitre.
Important
Il est important d’exécuter les scripts ci-dessous avec des privilèges d’administrateur.
Pour créer un certificat auto-signé avec ce script :
.\Create-SelfSignedCertificate.ps1 -CommonName "MyCompanyName" -StartDate 2017-10-01 -EndDate 2019-10-01
Notes
Les dates sont fournies au format ISO : AAA-MM-j j j
Le script réel peut être copié à partir d’ici :
#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
}
Vous serez invité à fournir un mot de passe pour chiffrer votre clé privée, ainsi que les deux . Fichier PFX et . Le fichier CER sera exporté vers le dossier actuel.
L’étape suivante consiste à inscrire une application Azure AD dans le client Azure Active Directory qui est lié à Office 365 client. Pour ce faire, ouvrez le Office 365 Admin ( à l’aide du compte d’un utilisateur membre du groupe https://admin.microsoft.com) Administrateurs globaux du client. Cliquez sur le lien « Azure Active Directory » disponible sous le groupe « Centres d’administration » dans l’arborescence de gauche du centre Office 365 Admin. Dans l’onglet du nouveau navigateur qui sera ouvert, vous trouverez le portail Microsoft Azure. S’il s’agit de la première fois que vous accédez au portail Azure avec votre compte, vous devez inscrire un nouvel abonnement Azure, fournissant des informations et une carte de crédit pour tout besoin de paiement. Mais ne vous inquiétez pas, pour jouer avec Azure AD et inscrire une application Office 365 vous ne payerez rien. En fait, ce sont des fonctionnalités gratuites. Une fois que vous avez accès au portail Azure, sélectionnez la section « Azure Active Directory » et choisissez l’option « Inscriptions d’applications ». Pour plus d’informations, voir la figure suivante.

Dans l’onglet « Inscriptions d’applications », vous trouverez la liste des applications Azure AD inscrites dans votre client. Cliquez sur le bouton « Nouvelle inscription » dans la partie supérieure gauche du volet. Ensuite, indiquez un nom pour votre application, puis cliquez sur « Enregistrer » en bas du tableau.

Important
Une fois l’application créée, copiez l'« ID de l’application (client) » comme vous en aurez besoin ultérieurement.
Cliquez maintenant sur « Autorisations d’API » dans la barre de menus de gauche, puis cliquez sur le bouton « Ajouter une autorisation ». Un nouveau blade s’affiche. Ici, vous choisissez les autorisations que vous allez accorder à cette application. Choisissez par exemple :
- SharePoint
- Autorisations de l’application
- Sites
- Sites.FullControl.All
- Sites
- Autorisations de l’application
Cliquez sur le bouton bleu « Ajouter des autorisations » en bas pour ajouter les autorisations à votre application. Les « autorisations d’application » sont celles accordées à l’application lors de l’exécution en tant qu’application uniquement.

La dernière étape consiste à « connecter » le certificat que nous avons créé précédemment à l’application. Cliquez sur « Certificats & secrets » dans la barre de menus de gauche. Cliquez sur le bouton « Télécharger certificat », sélectionnez le . Fichier CER que vous avez généré précédemment et cliquez sur « Ajouter » pour le télécharger.
Pour confirmer que le certificat a bien été inscrit, cliquez sur « Manifeste » dans la barre de menus de gauche. Recherchez la propriété keyCredentials. Elle doit ressembler à :
"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 vous voyez une section semblable à celle-ci, le certificat a été ajouté avec succès.
Dans cet exemple, l’autorisation d’application Sites.FullControl.All requiert le consentement de l’administrateur dans un client avant de pouvoir être utilisée. Pour ce faire, cliquez à nouveau sur « Autorisations d’API » dans le menu de gauche. En bas, vous verrez une section « Accorder le consentement ». Cliquez sur le bouton « Accorder le consentement de l’administrateur pour {{nom de l’organisation}} » et confirmez l’action en cliquant sur le bouton « Oui » qui apparaît en haut.

Utilisation de ce principal avec PnP PowerShell
Si vous souhaitez utiliser ce principal d’application AAD uniquement avec PnP PowerShell,après avoir installé le module PowerShell PnP, vous pouvez vous connecter à votre environnement SharePoint Online à l’aide des éléments suivants :
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"
Vous pouvez désormais effectuer des opérations via PnP PowerShell sur votre environnement SharePoint Online à l’aide de cette confiance d’application de certificat uniquement.
Notes
PnP PowerShell est une solution open source pour laquelle un support est assuré par la communauté active. Il n’existe pas de contrat SLA Microsoft pour le support technique relatif à cet outil open source.
Utilisation de ce principal dans votre application à l’aide de la bibliothèque SharePoint sites PnP Core
Dans une première étape, vous ajoutez la bibliothèque SharePointPnPCoreOnline NuGet package https://www.nuget.org/packages/SharePointPnPCoreOnline :
Une fois cette procédure effectuée, vous pouvez utiliser la construction de code ci-dessous :
using OfficeDevPnP.Core;
using System;
namespace AzureADCertAuth
{
class Program
{
static void Main(string[] args)
{
string siteUrl = "https://contoso.sharepoint.com/sites/demo";
using (var cc = new AuthenticationManager().GetAzureADAppOnlyAuthenticatedContext(siteUrl, "<application id>", "contoso.onmicrosoft.com", @"C:\BertOnlineAzureADAppOnly.pfx", "<password>"))
{
cc.Load(cc.Web, p => p.Title);
cc.ExecuteQuery();
Console.WriteLine(cc.Web.Title);
};
}
}
}
Notes
Le composant principal PnP( également appelé :PnP Sites Core) est une solution open source avec une communauté active qui fournit sa prise en charge. Il n’existe pas de contrat SLA Microsoft pour le support technique relatif à cet outil open source.
Utilisation de ce principal dans votre script Powershell à l’aide de la bibliothèque principale des sites PnP
Lors de l’utilisation d’Azure Automation Runbooks, ajoutez d’abord le certificat (.pfx) à l’aide de l’option Certificats (sous Ressources partagées), puis utilisez la cmdlet Get-AutomationCertificate pour récupérer le certificat à utiliser dans le script.
Notes
Vous devez d’abord ajouter le module SharePointPnPPowerShellOnline à votre compte Automation. Ce module contient l’assembly OfficeDevPnP.Core.dll nécessaire pour effectuer l’appel d’authentification.
# 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\OfficeDevPnP.Core.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 = [OfficeDevPnP.Core.AzureEnvironment]::Production
# instantiate the objects
$clientContext = new-object Microsoft.SharePoint.Client.ClientContext($siteUrl)
$authManager = new-object OfficeDevPnP.Core.AuthenticationManager
# configure the object
$clientContext = $authManager.GetAzureADAppOnlyAuthenticatedContext($siteUrl, $appId, $domain, $cert, $azureEnv)
# do some stuff
$clientContext.Load($clientContext.Web)
$clientContext.ExecuteQuery()
$clientContext.Web.Title
Utilisation de ce principal dans votre application et utilisation d’Azure KeyVault pour stocker le certificat et le récupérer à l’aide d’une fonction Azure
Ajoutez une identité gérée à la fonction Azure et accordez à cette identité l’accès (autorisation GET sur les secrets) à KeyVault.
Ci-dessous se trouve un appel légèrement différent à la même méthode GetAzureADAppOnlyAuthenticatedContext où nous passons un certificat réel au lieu d’un chemin d’accès au certificat. Une fonction supplémentaire est ajoutée pour récupérer le certificat à partir de KeyVault à l’aide de l’identité gérée de la fonction Azure. Cette récupération est transparente, car la « magie » se produit dans azureServiceTokenProvider.
static void Main(string[] args)
{
using (var cc = new AuthenticationManager().GetAzureADAppOnlyAuthenticatedContext(
siteUrl,
ApplicationId,
tenant + ".onmicrosoft.com",
GetKeyVaultCertificate("kv-spo", "AzureAutomationSPOAccess")))
{
cc.Load(cc.Web, p => p.Title);
cc.ExecuteQuery();
log.Info("Via PnP, we have site: " + cc.Web.Title);
};
}
internal 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 GetSecretMethod
if (keyVaultClient == null)
{
// this token provider gets the appid/secret from the azure function identity
// and thus makes the call on behalf of that appid/secret
var serviceTokenProvider = new AzureServiceTokenProvider();
keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(serviceTokenProvider.KeyVaultTokenCallback));
}
// Getting the certificate
var secret = keyVaultClient.GetSecretAsync("https://" + keyvaultName + ".vault.azure.net/", name);
// Returning the certificate
return new X509Certificate2(Convert.FromBase64String(secret.Result.Value));
// If you receive the following error when running the Function;
// Microsoft.Azure.WebJobs.Host.FunctionInvocationException:
// Exception while executing function: NotificationFunctions.QueueOperation--->
// System.Security.Cryptography.CryptographicException:
// The system cannot find the file specified.at System.Security.Cryptography.NCryptNative.ImportKey(SafeNCryptProviderHandle provider, Byte[] keyBlob, String format) at System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, CngKeyBlobFormat format, CngProvider provider)
//
// Please see https://stackoverflow.com/questions/31685278/create-a-self-signed-certificate-in-net-using-an-azure-web-application-asp-ne
// Add the following Application setting to the AF "WEBSITE_LOAD_USER_PROFILE = 1"
}
Utilisation de ce principal avec le scanneur de modernisation Pnp
Maintenant que vous avez créé le Azure Active Directory’inscription de l’application, procédez comme suit pour utiliser ce principal avec l’outil.
FAQ
Puis-je utiliser d’autres moyens que les certificats pour réaliser l’accès application uniquement pour mon application Azure AD ?
Non, toutes les autres options sont bloquées par SharePoint Online et entraînent un message de refus d’accès.