Partager via


Créer une méthode d’authentification personnalisée pour AD FS dans Windows Server

Cette procédure pas à pas fournit des instructions pour implémenter une méthode d’authentification personnalisée pour AD FS dans Windows Server 2012 R2. Pour plus d’informations, consultez Méthodes d’authentification supplémentaires.

Avertissement

L’exemple que vous pouvez créer ici est uniquement à des fins éducatives.  Ces instructions concernent l’implémentation la plus simple et la plus minimale possible pour exposer les éléments requis du modèle.  Il n’y a pas de back-end d’authentification, de traitement des erreurs ni de données de configuration.

Configuration de la zone de développement

Cette procédure pas à pas utilise Visual Studio 2012. Le projet peut être créé à l’aide de n’importe quel environnement de développement pouvant créer une classe .NET pour Windows. Le projet doit cibler .NET 4.5, car les méthodes BeginAuthentication et TryEndAuthentication utilisent le type System.Security.Claims.Claim, qui fait partie de la version 4.5 de .NET Framework. Une référence est requise pour le projet :

Dll de référence Comment y accéder Obligatoire pour
Microsoft.IdentityServer.Web.dll La dll se trouve dans %windir%\ADFS sur un serveur Windows Server 2012 R2 sur lequel AD FS a été installé.

Cette dll doit être copiée sur l’ordinateur de développement et une référence explicite doit être créée dans le projet.

Types d’interface, notamment IAuthenticationContext, IProofData

Créer le fournisseur

  1. Dans Visual Studio 2012, sélectionnez Fichier, >Nouveau>, Projet...

  2. Sélectionnez Bibliothèque de classes et vérifiez que vous ciblez .NET 4.5.

    Screenshot of the New Project dialog box showing the Class Library option selected.

  3. Effectuez une copie de Microsoft.IdentityServer.Web.dll à partir de %windir%\ADFS sur le serveur Windows Server 2012 R2 sur lequel AD FS a été installé, puis collez-la dans votre dossier Projet sur votre ordinateur de développement.

  4. Dans l'Explorateur de solutions, cliquez avec le bouton droit de la souris sur Références, puis cliquez sur Ajouter une référence...

  5. Accédez à votre copie locale de Microsoft.IdentityServer.Web.dll et cliquez sur Ajouter...

  6. Cliquez sur OK pour confirmer la nouvelle référence :

    Screenshot of the Reference Manager dialog box showing the Microsoft.IdentityServer.Web.dll selected.

    Vous devez à présent être configuré pour résoudre tous les types requis pour le fournisseur.

  7. Ajouter une nouvelle classe à votre projet (cliquez avec le bouton droit sur votre projet, Ajouter... Classe...) et donnez-lui un nom comme MyAdapter, illustré ci-dessous :

    Screenshot of the Add New Item dialog box with the Class option selected.

  8. Dans le nouveau fichier MyAdapter.cs, remplacez le code existant par ce qui suit :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Globalization;
    using System.IO;
    using System.Net;
    using System.Xml.Serialization;
    using Microsoft.IdentityServer.Web.Authentication.External;
    using Claim = System.Security.Claims.Claim;
    
    namespace MFAadapter
    {
        class MyAdapter : IAuthenticationAdapter
        {
            public IAuthenticationAdapterMetadata Metadata
            {
                //get { return new <instance of IAuthenticationAdapterMetadata derived class>; }
            }
    
            public IAdapterPresentation BeginAuthentication(Claim identityClaim, HttpListenerRequest request, IAuthenticationContext authContext)
            {
                //return new instance of IAdapterPresentationForm derived class
            }
    
            public bool IsAvailableForUser(Claim identityClaim, IAuthenticationContext authContext)
            {
                return true; //its all available for now
            }
    
            public void OnAuthenticationPipelineLoad(IAuthenticationMethodConfigData configData)
            {
                //this is where AD FS passes us the config data, if such data was supplied at registration of the adapter
            }
    
            public void OnAuthenticationPipelineUnload()
            {
    
            }
    
            public IAdapterPresentation OnError(HttpListenerRequest request, ExternalAuthenticationException ex)
            {
                //return new instance of IAdapterPresentationForm derived class
            }
    
            public IAdapterPresentation TryEndAuthentication(IAuthenticationContext authContext, IProofData proofData, HttpListenerRequest request, out Claim[] outgoingClaims)
            {
                //return new instance of IAdapterPresentationForm derived class
            }
    
        }
    }
    
  9. Nous ne sommes pas encore prêts à construire... il y a encore deux autres interfaces à utiliser.

    Ajoutez deux classes supplémentaires à votre projet : l’une pour les métadonnées et l’autre pour le formulaire de présentation. Vous pouvez les ajouter dans le même fichier que la classe ci-dessus.

    class MyMetadata : IAuthenticationAdapterMetadata
    {
    
    }
    
    class MyPresentationForm : IAdapterPresentationForm
    {
    
    }
    
  10. Ensuite, vous pouvez ajouter les membres requis pour chacune d’elles. Tout d’abord, les métadonnées (avec des commentaires inline utiles)

    class MyMetadata : IAuthenticationAdapterMetadata
    {
        //Returns the name of the provider that will be shown in the AD FS management UI (not visible to end users)
        public string AdminName
        {
            get { return "My Example MFA Adapter"; }
        }
    
        //Returns an array of strings containing URIs indicating the set of authentication methods implemented by the adapter 
        /// AD FS requires that, if authentication is successful, the method actually employed will be returned by the
        /// final call to TryEndAuthentication(). If no authentication method is returned, or the method returned is not
        /// one of the methods listed in this property, the authentication attempt will fail.
        public virtual string[] AuthenticationMethods 
        {
            get { return new[] { "http://example.com/myauthenticationmethod1", "http://example.com/myauthenticationmethod2" }; }
        }
    
        /// Returns an array indicating which languages are supported by the provider. AD FS uses this information
        /// to determine the best language\locale to display to the user.
        public int[] AvailableLcids
        {
            get
            {
                return new[] { new CultureInfo("en-us").LCID, new CultureInfo("fr").LCID};
            }
        }
    
        /// Returns a Dictionary containing the set of localized friendly names of the provider, indexed by lcid. 
        /// These Friendly Names are displayed in the "choice page" offered to the user when there is more than 
        /// one secondary authentication provider available.
        public Dictionary<int, string> FriendlyNames
        {
            get
            {
                Dictionary<int, string> _friendlyNames = new Dictionary<int, string>();
                _friendlyNames.Add(new CultureInfo("en-us").LCID, "Friendly name of My Example MFA Adapter for end users (en)");
                _friendlyNames.Add(new CultureInfo("fr").LCID, "Friendly name translated to fr locale");
                return _friendlyNames;
            }
        }
    
        /// Returns a Dictionary containing the set of localized descriptions (hover over help) of the provider, indexed by lcid. 
        /// These descriptions are displayed in the "choice page" offered to the user when there is more than one 
        /// secondary authentication provider available.
        public Dictionary<int, string> Descriptions
        {
            get 
            {
                Dictionary<int, string> _descriptions = new Dictionary<int, string>();
                _descriptions.Add(new CultureInfo("en-us").LCID, "Description of My Example MFA Adapter for end users (en)");
                _descriptions.Add(new CultureInfo("fr").LCID, "Description translated to fr locale");
                return _descriptions; 
            }
        }
    
        /// Returns an array indicating the type of claim that the adapter uses to identify the user being authenticated.
        /// Note that although the property is an array, only the first element is currently used.
        /// MUST BE ONE OF THE FOLLOWING
        /// "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"
        /// "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"
        /// "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
        /// "http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid"
        public string[] IdentityClaims
        {
            get { return new[] { "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" }; }
        }
    
        //All external providers must return a value of "true" for this property.
        public bool RequiresIdentity
        {
            get { return true; }
        }
    }
    

    Vous devriez pouvoir maintenant faire F12 (clic droit – Accéder à la définition) sur IAuthenticationAdapter pour voir l’ensemble des membres de l’interface requis.

    Ensuite, vous pouvez effectuer une implémentation de ceux-ci.

  11. Remplacez l’intégralité des contenus de votre classe par ce qui suit :

    namespace MFAadapter
    {
        class MyAdapter : IAuthenticationAdapter
        {
            public IAuthenticationAdapterMetadata Metadata
            {
                //get { return new <instance of IAuthenticationAdapterMetadata derived class>; }
            }
    
            public IAdapterPresentation BeginAuthentication(Claim identityClaim, HttpListenerRequest request, IAuthenticationContext authContext)
            {
                //return new instance of IAdapterPresentationForm derived class
            }
    
            public bool IsAvailableForUser(Claim identityClaim, IAuthenticationContext authContext)
            {
                return true; //its all available for now
            }
    
            public void OnAuthenticationPipelineLoad(IAuthenticationMethodConfigData configData)
            {
                //this is where AD FS passes us the config data, if such data was supplied at registration of the adapter
            }
    
            public void OnAuthenticationPipelineUnload()
            {
    
            }
    
            public IAdapterPresentation OnError(HttpListenerRequest request, ExternalAuthenticationException ex)
            {
                //return new instance of IAdapterPresentationForm derived class
            }
    
            public IAdapterPresentation TryEndAuthentication(IAuthenticationContext authContext, IProofData proofData, HttpListenerRequest request, out Claim[] outgoingClaims)
            {
                //return new instance of IAdapterPresentationForm derived class
            }
        }
    }
    

    Ensuite, le formulaire de présentation :

    class MyPresentationForm : IAdapterPresentationForm
    {
        /// Returns the HTML Form fragment that contains the adapter user interface. This data will be included in the web page that is presented
        /// to the cient.
        public string GetFormHtml(int lcid)
        {
            string htmlTemplate = Resources.FormPageHtml; //todo we will implement this
            return htmlTemplate;
        }
    
        /// Return any external resources, ie references to libraries etc., that should be included in
        /// the HEAD section of the presentation form html.
        public string GetFormPreRenderHtml(int lcid)
        {
            return null;
        }
    
        //returns the title string for the web page which presents the HTML form content to the end user
        public string GetPageTitle(int lcid)
        {
            return "MFA Adapter";
        }
    }
    
  12. Notez le « todo » pour l’élément Resources.FormPageHtml ci-dessus. Vous pouvez le corriger en une minute, mais nous allons d’abord ajouter les instructions de retour requises finales, en fonction des nouveaux types récemment implémentés, à votre classe MyAdapter initiale. Pour ce faire, ajoutez les éléments suivants à votre implémentation IAuthenticationAdapter existante :

    class MyAdapter : IAuthenticationAdapter
    {
        public IAuthenticationAdapterMetadata Metadata
        {
            //get { return new <instance of IAuthenticationAdapterMetadata derived class>; }
            get { return new MyMetadata(); }
        }
    
        public IAdapterPresentation BeginAuthentication(Claim identityClaim, HttpListenerRequest request, IAuthenticationContext authContext)
        {
            //return new instance of IAdapterPresentationForm derived class
            return new MyPresentationForm();
        }
    
        public bool IsAvailableForUser(Claim identityClaim, IAuthenticationContext authContext)
        {
            return true; //its all available for now
        }
    
        public void OnAuthenticationPipelineLoad(IAuthenticationMethodConfigData configData)
        {
            //this is where AD FS passes us the config data, if such data was supplied at registration of the adapter
        }
    
        public void OnAuthenticationPipelineUnload()
        {
    
        }
    
        public IAdapterPresentation OnError(HttpListenerRequest request, ExternalAuthenticationException ex)
        {
            //return new instance of IAdapterPresentationForm derived class
            return new MyPresentationForm();
        }
    
        public IAdapterPresentation TryEndAuthentication(IAuthenticationContext authContext, IProofData proofData, HttpListenerRequest request, out Claim[] outgoingClaims)
        {
            //return new instance of IAdapterPresentationForm derived class
            outgoingClaims = new Claim[0];
            return new MyPresentationForm();
        }
    
    }
    
  13. À présent, pour le fichier de ressources contenant le fragment html. Créez un fichier texte dans votre dossier de projet avec les contenus suivants :

    <div id="loginArea">
        <form method="post" id="loginForm" >
            <!-- These inputs are required by the presentation framework. Do not modify or remove -->
            <input id="authMethod" type="hidden" name="AuthMethod" value="%AuthMethod%" />
            <input id="context" type="hidden" name="Context" value="%Context%" />
            <!-- End inputs are required by the presentation framework. -->
            <p id="pageIntroductionText">This content is provided by the MFA sample adapter. Challenge inputs should be presented below.</p>
            <label for="challengeQuestionInput" class="block">Question text</label>
            <input id="challengeQuestionInput" name="ChallengeQuestionAnswer" type="text" value="" class="text" placeholder="Answer placeholder" />
            <div id="submissionArea" class="submitMargin">
                <input id="submitButton" type="submit" name="Submit" value="Submit" onclick="return AuthPage.submitAnswer()"/>
            </div>
        </form>
        <div id="intro" class="groupMargin">
            <p id="supportEmail">Support information</p>
        </div>
        <script type="text/javascript" language="JavaScript">
            //<![CDATA[
            function AuthPage() { }
            AuthPage.submitAnswer = function () { return true; };
            //]]>
        </script>
    </div>
    
  14. Ensuite, sélectionnez Projet->Ajouter un composant..., Fichier de ressources et nommez le fichier Ressources, puis cliquez sur Ajouter :

    Screenshot of the Add New Item dialog box showing Resource File selected.

  15. Ensuite, dans le fichier Resources.resx, choisissez Ajouter une ressource... Ajouter un fichier existant. Accédez au fichier texte (contenant le fragment html) que vous avez enregistré ci-dessus.

    Assurez-vous que votre code GetFormHtml résout correctement le nom de la nouvelle ressource par le préfixe de nom du fichier de ressources (fichier .resx), suivi du nom de la ressource elle-même :

    public string GetFormHtml(int lcid)
    {
        string htmlTemplate = Resources.MfaFormHtml; //Resxfilename.resourcename
        return htmlTemplate;
    }
    

Vous devez maintenant être en mesure de générer.

Générer l’adaptateur

L’adaptateur doit être intégré à un assembly .NET fortement nommé qui peut être installé dans le GAC dans Windows. Pour ce faire dans un projet Visual Studio, procédez comme suit :

  1. Cliquez avec le bouton droit sur le nom de votre projet dans l'Explorateur de solutions, puis cliquez sur Propriétés.

  2. Sous l’onglet Signature, cochez Signer l’assembly et choisissez <Nouveau...> sous Choisir un fichier de clé de nom fort :. Entrez un nom de fichier de clé et un mot de passe, puis cliquez sur OK. Vérifiez ensuite que la case Signer l’assembly est cochée et que la case Différer la signature uniquement est décochée. La page Signature des propriétés doit ressembler à ceci :

    build the provider

  3. Générez ensuite la solution.

Déployer l’adaptateur sur votre machine de test AD FS

Pour qu’un fournisseur externe puisse être appelé par AD FS, il doit être inscrit dans le système. Les fournisseurs d’adaptateurs doivent fournir un programme d’installation qui effectue les actions d’installation nécessaires, y compris l’installation dans le GAC. De plus, le programme d’installation doit prendre en charge l’inscription dans AD FS. Si ce n’est pas fait, l’administrateur doit exécuter les étapes Windows PowerShell ci-dessous. Ces étapes peuvent être utilisées dans le lab pour activer le test et le débogage.

Préparer l’ordinateur AD FS de test

Copiez des fichiers et ajoutez-les à GAC.

  1. Vérifiez que vous disposez d’un ordinateur ou d’une machine virtuelle Windows Server 2012 R2.

  2. Installez le service de rôle AD FS et configurez une batterie avec au moins un nœud.

    Pour plus de détails sur les étapes de configuration d’un serveur de fédération dans un environnement lab, consultez le Guide de déploiement des services AD FS Windows Server 2012 R2.

  3. Copiez les outils Gacutil.exe sur le serveur.

    Gacutil.exe se trouvent dans %homedrive%Program Files (x86)Microsoft SDKsWindowsv8.0AbinNETFX 4.0 Tools sur un ordinateur Windows 8. Vous aurez besoin du fichier gacutil.exe lui-même et du dossier 1033, en-US et de l’autre dossier de ressources localisées sous l’emplacement NETFX 4.0 Tools.

  4. Copiez votre ou vos fichiers de fournisseur (un ou plusieurs fichiers .dll de noms forts signés) dans le même emplacement de dossier que gacutil.exe (l’emplacement est juste pour des raisons pratiques)

  5. Ajoutez votre ou vos fichiers .dll au GAC sur chaque serveur de fédération AD FS de la batterie de serveurs :

    Exemple : utilisation de l’outil en ligne de commande GACutil.exe pour ajouter une dll au GAC : C:>.gacutil.exe /if .<yourdllname>.dll

    Pour afficher l’entrée résultante dans le GAC :C:>.gacutil.exe /l <yourassemblyname>

Inscrire votre fournisseur dans AD FS

Une fois les conditions préalables ci-dessus remplies, ouvrez une fenêtre de commande Windows PowerShell sur votre serveur de fédération et entrez les commandes suivantes (notez que si vous utilisez une batterie de serveurs de fédération qui utilise Base de données interne Windows, vous devez exécuter ces commandes sur le serveur de fédération principal de la batterie de serveurs) :

  1. Register-AdfsAuthenticationProvider –TypeName YourTypeName –Name “AnyNameYouWish” [–ConfigurationFilePath (optional)]

    Où YourTypeName est votre nom de type fort .NET : « YourDefaultNamespace.YourIAuthenticationAdapterImplementationClassName, YourAssemblyName, Version=YourAssemblyVersion, Culture=neutral, PublicKeyToken=YourPublicKeyTokenValue, processorArchitecture=MSIL »

    Cela inscrit votre fournisseur externe dans AD FS, avec le nom fourni comme AnyNameYouWish ci-dessus.

  2. Redémarrez le service AD FS (à l’aide du composant logiciel enfichable Services Windows, par exemple).

  3. Exécutez la commande suivante : Get-AdfsAuthenticationProvider.

    Cela affiche votre fournisseur comme l’un des fournisseurs dans le système.

    Exemple :

    $typeName = "MFAadapter.MyAdapter, MFAadapter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e675eb33c62805a0, processorArchitecture=MSIL”
    Register-AdfsAuthenticationProvider -TypeName $typeName -Name “MyMFAAdapter”
    net stop adfssrv
    net start adfssrv
    

    Si le service d’inscription d’appareil est activé dans votre environnement AD FS, exécutez également la commande PowerShell suivante : net start drs

    Pour vérifier le fournisseur inscrit, utilisez la commande PowerShell suivante :Get-AdfsAuthenticationProvider.

    Cela affiche votre fournisseur comme l’un des fournisseurs dans le système.

Créer la stratégie d’authentification AD FS qui appelle votre adaptateur

Créer la stratégie d’authentification à l’aide du composant logiciel enfichable Gestion AD FS

  1. Ouvrez le composant logiciel enfichable Gestion AD FS (à partir du menu Outils du Gestionnaire de serveur).

  2. Cliquez sur Stratégies d’authentification.

  3. Dans le volet central, sous Authentification multifacteur, cliquez sur le lien Modifier à droite de Paramètres globaux.

  4. Sous Sélectionner des méthodes d’authentification supplémentaires en bas de la page, cochez la case pour le nom d’administrateur de votre fournisseur. Cliquez sur Appliquer.

  5. Pour fournir un « déclencheur » pour appeler MFA à l’aide de votre adaptateur, sous Emplacements, cochez à la fois Extranet et Intranet, par exemple. Cliquez sur OK. (Pour configurer des déclencheurs par partie de confiance, consultez « Créer la stratégie d’authentification à l’aide de Windows PowerShell » ci-dessous.)

  6. Vérifiez les résultats à l’aide des commandes suivantes :

    Utilisez d’abord Get-AdfsGlobalAuthenticationPolicy. Vous devez voir votre nom de fournisseur comme l’une des valeurs AdditionalAuthenticationProvider.

    Ensuite, utilisez Get-AdfsAdditionalAuthenticationRule. Vous devez voir les règles configurées pour Extranet et Intranet à la suite de la sélection de votre stratégie dans l’interface utilisateur de l’administrateur.

Créer la stratégie d'authentification à l'aide de Windows PowerShell

  1. Tout d’abord, activez le fournisseur dans la stratégie globale :

    Set-AdfsGlobalAuthenticationPolicy -AdditionalAuthenticationProvider “YourAuthProviderName”`
    

    Notes

    Notez que la valeur fournie pour le paramètre AdditionalAuthenticationProvider correspond à la valeur fournie pour le paramètre « Name » dans l’applet de commande Register-AdfsAuthenticationProvider ci-dessus et à la propriété « Name » de la sortie de l’applet de commande Get-AdfsAuthenticationProvider.

    Set-AdfsGlobalAuthenticationPolicy –AdditionalAuthenticationProvider “MyMFAAdapter”`
    
  2. Ensuite, configurez des règles globales ou spécifiques aux parties de confiance pour déclencher MFA :

    Exemple 1 : pour créer une règle globale qui exige MFA pour les requêtes externes :

    Set-AdfsAdditionalAuthenticationRule –AdditionalAuthenticationRules 'c:[type == "http://schemas.microsoft.com/ws/2012/01/insidecorporatenetwork", value == "false"] => issue(type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod", value = "http://schemas.microsoft.com/claims/multipleauthn" );'
    

    Exemple 2 : pour créer des règles MFA qui exigent MFA pour les demandes externes adressées à une partie de confiance spécifique. (Remarque : Les fournisseurs individuels ne peuvent pas être connectés aux parties de confiance individuelles dans AD FS dans Windows Server 2012 R2).

    $rp = Get-AdfsRelyingPartyTrust –Name <Relying Party Name>
    Set-AdfsRelyingPartyTrust –TargetRelyingParty $rp –AdditionalAuthenticationRules 'c:[type == "http://schemas.microsoft.com/ws/2012/01/insidecorporatenetwork", value == "false"] => issue(type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod", value = "http://schemas.microsoft.com/claims/multipleauthn" );'
    

S’authentifier avec MFA à l’aide de votre adaptateur

Enfin, effectuez les étapes ci-dessous pour tester votre adaptateur :

  1. Vérifiez que le type d’authentification principale globale AD FS est configuré en tant qu’authentification par formulaire pour Extranet et Intranet (cela facilite l’authentification de votre version de démonstration en tant qu’utilisateur spécifique)

    1. Dans le composant logiciel enfichable AD FS, sous Stratégies d’authentification, dans la zone Authentification principale, cliquez sur Modifier en regard de Paramètres globaux.

      1. Ou cliquez simplement sur l’onglet Principal dans l’interface utilisateur de la stratégie multifacteur.
  2. Vérifiez que l’authentification par formulaire est la seule option activée pour la méthode d’authentification de l’Extranet et de l’Intranet. Cliquez sur OK.

  3. Ouvrez la page html de connexion lancée par l’IDP (https://< fsname>/adfs/ls/idpinitiatedsignon.htm) et connectez-vous en tant qu’utilisateur AD valide dans votre environnement de test.

  4. Entrez les informations d’identification pour l’authentification principale.

  5. Vous devez voir la page des formulaires MFA avec des exemples de questions de défi s’afficher.

    Si vous avez configuré plusieurs adaptateurs, vous verrez la page de choix MFA avec votre nom convivial ci-dessus.

    Screenshot of the the M F A forms page with example challenge questions.

    Screenshot of the the M F A choice page.

Vous disposez maintenant d’une implémentation fonctionnelle de l’interface et vous connaissez le fonctionnement du modèle. Vous pouvez essayer comme exemple supplémentaire de définir des points d’arrêt dans BeginAuthentication et TryEndAuthentication. Notez comment BeginAuthentication est exécuté lorsque l’utilisateur entre pour la première fois dans le formulaire MFA, tandis que TryEndAuthentication est déclenché à chaque envoi du formulaire.

Mettre à jour l’adaptateur pour une authentification réussie

Mais, attendez : votre exemple d’adaptateur ne s’authentifiera jamais correctement ! En effet, rien dans votre code ne retourne la valeur null pour TryEndAuthentication.

En effectuant les procédures ci-dessus, vous avez créé une implémentation d’adaptateur de base et vous l’avez ajoutée à un serveur AD FS. Vous pouvez obtenir la page de formulaires MFA, mais vous ne pouvez pas encore vous authentifier, car vous n’avez pas encore placé la logique correcte dans votre implémentation TryEndAuthentication. Ajoutons-la.

Rappelez-vous votre implémentation TryEndAuthentication :

public IAdapterPresentation TryEndAuthentication(IAuthenticationContext authContext, IProofData proofData, HttpListenerRequest request, out Claim[] outgoingClaims)
{
    //return new instance of IAdapterPresentationForm derived class
    outgoingClaims = new Claim[0];
    return new MyPresentationForm();
}

Nous allons la mettre à jour afin qu’il ne retourne pas toujours MyPresentationForm(). Pour cela, vous pouvez créer une méthode utilitaire simple au sein de votre classe :

static bool ValidateProofData(IProofData proofData, IAuthenticationContext authContext)
{
    if (proofData == null || proofData.Properties == null || !proofData.Properties.ContainsKey("ChallengeQuestionAnswer"))
    {
        throw new ExternalAuthenticationException("Error - no answer found", authContext);
    }

    if ((string)proofData.Properties["ChallengeQuestionAnswer"] == "adfabric")
    {
        return true;
    }
    else
    {
        return false;
    }
}

Ensuite, mettez à jour TryEndAuthentication comme suit :

public IAdapterPresentation TryEndAuthentication(IAuthenticationContext authContext, IProofData proofData, HttpListenerRequest request, out Claim[] outgoingClaims)
{
    outgoingClaims = new Claim[0];
    if (ValidateProofData(proofData, authContext))
    {
        //authn complete - return authn method
        outgoingClaims = new[]
        {
            // Return the required authentication method claim, indicating the particulate authentication method used.
            new Claim( "http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod", "http://example.com/myauthenticationmethod1" )
        };
        return null;
    }
    else
    {
        //authentication not complete - return new instance of IAdapterPresentationForm derived class
        return new MyPresentationForm();
    }
}

Vous devez maintenant mettre à jour l’adaptateur dans la zone de test. Vous devez d’abord annuler la stratégie AD FS, puis annuler l’inscription à partir d’AD FS et redémarrer AD FS, puis supprimer la .dll du GAC, ajouter la nouvelle .dll au GAC, puis l’inscrire dans AD FS, redémarrer AD FS et reconfigurer la stratégie AD FS.

Déployer et configurer l’adaptateur mis à jour sur votre ordinateur AD FS de test

Effacer la stratégie AD FS

Décochez toutes les cases associées à MFA dans l’interface utilisateur de MFA, illustrées ci-dessous, puis cliquez sur OK.

clear policy

Désinscrire le fournisseur (Windows PowerShell)

PS C:> Unregister-AdfsAuthenticationProvider –Name “YourAuthProviderName”

Exemple :PS C:> Unregister-AdfsAuthenticationProvider –Name “MyMFAAdapter”

La valeur que vous passez pour « Name » est la même valeur que « Name » fournie à l’applet de commande Register-AdfsAuthenticationProvider. Il s’agit également de la propriété « Name » qui est sortie de Get-AdfsAuthenticationProvider.

Avant de désinscrire un fournisseur, vous devez le supprimer de la stratégie AdfsGlobalAuthenticationPolicy (soit en décochant les cases que vous avez cochées dans le composant logiciel enfichable de gestion AD FS, soit en utilisant Windows PowerShell.)

Le service AD FS doit être redémarré après cette opération.

Supprimer l’assembly de GAC

  1. Tout d’abord, utilisez la commande suivante pour rechercher le nom fort complet de l’entrée :C:>.gacutil.exe /l <yourAdapterAssemblyName>

    Exemple :C:>.gacutil.exe /l mfaadapter

  2. Ensuite, utilisez la commande suivante pour le supprimer du GAC :.gacutil /u “<output from the above command>”

    Exemple :C:>.gacutil /u “mfaadapter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e675eb33c62805a0, processorArchitecture=MSIL”

Ajouter l’assembly mis à jour au GAC

Veillez d’abord à coller la .dll mise à jour localement. C:>.gacutil.exe /if .MFAAdapter.dll

Afficher l’assembly dans le GAC (ligne cmd)

C:> .gacutil.exe /l mfaadapter

Inscrire votre fournisseur dans AD FS

  1. PS C:>$typeName = "MFAadapter.MyAdapter, MFAadapter, Version=1.0.0.1, Culture=neutral, PublicKeyToken=e675eb33c62805a0, processorArchitecture=MSIL”

  2. PS C:>Register-AdfsAuthenticationProvider -TypeName $typeName -Name “MyMFAAdapter1”

  3. Redémarrez le service AD FS.

Créer la stratégie d’authentification à l’aide du composant logiciel enfichable Gestion AD FS

  1. Ouvrez le composant logiciel enfichable Gestion AD FS (à partir du menu Outils du Gestionnaire de serveur).

  2. Cliquez sur Stratégies d’authentification.

  3. Sous Authentification multifacteur, cliquez sur le lien Modifier à droite de Paramètres globaux.

  4. Sous Sélectionner des méthodes d’authentification supplémentaires, cochez la case pour le nom d’administrateur de votre fournisseur. Cliquez sur Appliquer.

  5. Pour fournir un « déclencheur » pour appeler MFA à l’aide de votre adaptateur, sous Emplacements, cochez à la fois Extranet et Intranet, par exemple. Cliquez sur OK.

S’authentifier avec MFA à l’aide de votre adaptateur

Enfin, effectuez les étapes ci-dessous pour tester votre adaptateur :

  1. Vérifiez que le type d’authentification principale globale AD FS est configuré en tant qu’authentification par formulaire pour Extranet et Intranet (cela facilite l’authentification en tant qu’utilisateur spécifique).

    1. Dans le composant logiciel enfichable Gestion AD FS, sous Stratégies d’authentification, dans la zone Authentification principale, cliquez sur Modifier en regard de Paramètres globaux.

      1. Ou cliquez simplement sur l’onglet Principal dans l’interface utilisateur de stratégie multifacteur.
  2. Vérifiez que l’authentification par formulaire est la seule option activée pour la méthode d'authentification de l’Extranet et de l’Intranet. Cliquez sur OK.

  3. Ouvrez la page html de connexion lancée par l’IDP (https://< fsname>/adfs/ls/idpinitiatedsignon.htm) et connectez-vous en tant qu’utilisateur AD valide dans votre environnement de test.

  4. Entrez les informations d’identification pour l’authentification principale.

  5. Vous devez voir la page des formulaires MFA avec un exemple de texte de requête s’afficher.

    1. Si vous avez configuré plusieurs adaptateurs, vous verrez la page de choix MFA avec votre nom convivial.

Vous devez voir une connexion réussie lors de la saisie d’adfabric dans la page d’authentification MFA.

Screenshot of the M F A forms page with example challenge text.

Screenshot of the M F A successful sign in page.

Voir aussi

Autres ressources

Méthodes d’authentification supplémentaires

Gérer les risques avec une authentification multifacteur supplémentaire pour les applications sensibles