Comment implémenter correctement l'authentification Windows avec Identity Server 4? Existe-t-il des exemples pour cela?
J'ai examiné le code source d'IdentityServer 4 et, dans le projet Host du AccountController, j'ai constaté qu'il existe des contrôles d'authentification Windows et qu'ils sont implémentés en tant que fournisseur externe. Mais je ne peux pas sembler travailler la configuration. Quelqu'un at-il implémenté avec succès l’authentification Windows avec idsrv4 et comment?
Si vous rencontrez des problèmes dans les résultats de recherche qui ont du mal à concilier le démarrage rapide avec le démarrage rapide ASPNET Identity, voici les éléments manquants.
Dans la plupart des cas, vous souhaitez utiliser le code d'identité ASPNET, en vous servant de SignInManager pour effectuer le gros du travail. Une fois que vous y êtes arrivé et que vous avez ajouté le code d'authentification de la fenêtre à partir du démarrage rapide, vous devriez arriver au point où tout semble fonctionner, mais vous obtenez null à cette ligne du rappel:
ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync();
Pour que Windows soit traité comme un véritable fournisseur externe, au lieu d'ajouter "scheme" aux propriétés d'authentification autour de la ligne 163, vous souhaitez remplacer la clé par "LoginProvider":
properties.Items.Add("LoginProvider", AccountOptions.WindowsAuthenticationSchemeName);
J'utilise une requête de domaine pour extraire des informations supplémentaires sur mes utilisateurs, ressemble à ceci:
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain))
using (UserPrincipal up = UserPrincipal.FindByIdentity(pc, wp.Identity.Name))
{
if (up == null)
{
throw new NullReferenceException($"Unable to find user: {wp.Identity.Name}");
}
id.AddClaim(new Claim(ClaimTypes.NameIdentifier, up.Sid.Value));
id.AddClaim(new Claim(JwtClaimTypes.Subject, wp.Identity.Name));
id.AddClaim(new Claim(JwtClaimTypes.Name, wp.Identity.Name));
id.AddClaim(new Claim(JwtClaimTypes.Email, up.EmailAddress));
id.AddClaim(new Claim(Constants.ClaimTypes.Upn, up.UserPrincipalName));
id.AddClaim(new Claim(JwtClaimTypes.GivenName, up.GivenName));
id.AddClaim(new Claim(JwtClaimTypes.FamilyName, up.Surname));
}
Ce que vous prétendez ajouter dépend de vous, mais vous DEVEZ obtenir un identifiant de type ClaimTypes.NameIdentifier pour que SigninManager le trouve. SID semble être la meilleure utilisation pour moi. La dernière chose à changer est l'appel SignInAsync pour utiliser le schéma correct autour de la ligne 178-181:
await HttpContext.SignInAsync(IdentityConstants.ExternalScheme, new ClaimsPrincipal(id), properties);
À moins que vous ne surchargiez les schémas par défaut utilisés par IdentityServer4 dans .net core 2, il s'agit du schéma par défaut correct. Et maintenant, votre appel à GetExternalLoginInfoAsync dans le rappel fonctionnera et vous pourrez continuer!
Dans AccountOptions.cs
de votre Identity Server, assurez-vous que public static bool WindowsAuthenticationEnabled = true;
, je pense que le démarrage rapide a la valeur par défaut false
Assurez-vous que votre pool d'applications pour le serveur d'identité utilise un compte avec les informations d'identification appropriées (je suppose qu'un compte peut interroger AD). Je ne pouvais pas utiliser les comptes intégrés AppPoolIdentity, LocalService ou Network. LocalSystem a presque fonctionné mais par une autre erreur.
Connectez-vous au moins une fois à ce serveur Web avec le compte que vous avez créé ci-dessus pour le pool d'applications. Ce compte ne doit pas nécessairement être un administrateur. Définissez les paramètres avancés du pool d'applications pour charger le profil.
Utilisez les informations d'identification anonymes et Windows définies dans IIS à la racine de votre Identity Server. Vous n'avez pas besoin de digérer ou de base.