Seamless SSO : la rotation de la clé AZUREADSSOACC échoue sur Microsoft.IdentityModel.Abstractions
New-AzureADSSOAuthenticationContext renvoie « Could not load file or assembly Microsoft.IdentityModel.Abstractions ». Diagnostic et contournement pour renouveler quand même la clé Kerberos.
Microsoft recommande de renouveler la clé de déchiffrement Kerberos du compte ordinateur AZUREADSSOACC au moins tous les 30 jours.
Récement chez un de mes client , la procédure s’est arrêtée dès la première commande avec l’erreur suivante :
New-AzureADSSOAuthenticationContext : Could not load file or assembly
'Microsoft.IdentityModel.Abstractions, Version=8.14.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35' or one of its dependencies.
The system cannot find the file specified.
Le module AzureADSSO.psd1 réclame une version précise de cette DLL et PowerShell ne parvient pas à la résoudre, alors qu’elle est bien installée avec Entra ID Connect.
Alors pour résoudre le problème et procéder au renouvellement, voici comment j’ai procédé :
1. Vérifier la présence et la version de la DLL
Get-ChildItem "C:\Program Files\Microsoft Azure Active Directory Connect",
"C:\Program Files\Microsoft Azure AD Sync" `
-Recurse -Filter Microsoft.IdentityModel.Abstractions.dll -ErrorAction SilentlyContinue |
Select-Object FullName,
@{n='Version';e={[Reflection.AssemblyName]::GetAssemblyName($_.FullName).Version}}
Si le fichier est présent dans le dossier d’Entra Connect, le problème ne vient pas d’une installation incomplète : c’est le chargement de la dépendance qui échoue.
2. Contournement : aider PowerShell à trouver les DLL
Dans une nouvelle fenêtre Windows PowerShell ouverte en administrateur sur le serveur Entra ID Connect, on enregistre un petit résolveur d’assemblies avant d’importer le module. Quand .NET ne trouve pas une DLL, le résolveur réutilise celle déjà chargée en mémoire, sinon il la charge depuis le dossier d’Entra Connect.
Set-Location "C:\Program Files\Microsoft Azure Active Directory Connect"
$src = @"
using System; using System.IO; using System.Reflection;
public static class AadcResolver {
static readonly string Dir = @"C:\Program Files\Microsoft Azure Active Directory Connect";
public static void Register() { AppDomain.CurrentDomain.AssemblyResolve += OnResolve; }
static Assembly OnResolve(object sender, ResolveEventArgs e) {
string n = new AssemblyName(e.Name).Name;
if (n.EndsWith(".resources")) return null;
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
if (a.GetName().Name == n) return a;
string p = Path.Combine(Dir, n + ".dll");
return File.Exists(p) ? Assembly.LoadFrom(p) : null;
}
}
"@
Add-Type -TypeDefinition $src -Language CSharp
[AadcResolver]::Register()
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Import-Module .\AzureADSSO.psd1 -Force
New-AzureADSSOAuthenticationContext
La fenêtre d’authentification s’ouvre : connectez-vous avec un compte avec à minima le rôle Hybrid Identity Administrator / Administrateur d’identité hybride.
Le résolveur renvoie la DLL déjà chargée quelle que soit sa version. C’est ce qui débloque la situation, mais c’est un contournement : il ne vaut que pour la session PowerShell en cours et ne modifie rien sur le serveur. Fermez la fenêtre une fois la rotation terminée.
3. Terminer la rotation de la clé
On reprend ensuite la procédure documentée par Microsoft :
# Forêts AD sur lesquelles le SSO transparent est activé (liste "Domains")
Get-AzureADSSOStatus | ConvertFrom-Json
# Compte administrateur du domaine, au format SAM : CONTOSO\admin ou contoso.com\admin
$creds = Get-Credential
# Renouvelle la clé dans l'AD local ET dans Entra ID
Update-AzureADSSOForest -OnPremCredentials $creds
Points de vigilance :
- Une seule exécution par forêt. Lancer
Update-AzureADSSOForestdeux fois de suite casse le SSO jusqu’à l’expiration des tickets Kerberos des utilisateurs. - Le compte administrateur du domaine ne doit pas être membre de Protected Users, sinon l’opération échoue.
- Si un administrateur délégué (non admin du domaine) lance la commande, ajoutez
-PreserveCustomPermissionsOnDesktopSsoAccount. - Inutile de le faire sur un serveur Entra Connect en mode intermédiaire (staging).
- Plusieurs forêts : répétez l’opération pour chacune, en vérifiant l’accès au catalogue global (TCP 3268 et 3269).
4. Contrôler la date du dernier renouvellement
Get-ADComputer AZUREADSSOACC -Properties PasswordLastSet |
Select-Object Name, PasswordLastSet
La date doit correspondre au jour de l’opération. Pensez à planifier un rappel tous les 30 jours.
Pourquoi c’est utile : une clé Kerberos jamais renouvelée est une cible de choix ; or cette procédure est souvent repoussée parce qu’elle « plante » ou non incluse dans les process. Ce contournement permet de la faire quand même, sans réinstaller Entra Connect.
Procédure officielle : FAQ du SSO transparent Microsoft Entra – rotation de la clé AZUREADSSO.