Compilación de un método de autenticación personalizado para AD FS en Windows Server

En este tutorial se proporcionan instrucciones para implementar un método de autenticación personalizado para AD FS en Windows Server 2012 R2. Para obtener más información, consulte Métodos de autenticación adicionales.

Advertencia

El ejemplo que puede crear aquí es solo para fines educativos.  Estas instrucciones son para la implementación más sencilla y mínima posible para exponer los elementos necesarios del modelo.  No hay ningún back-end de autenticación, procesamiento de errores ni datos de configuración.

Configurar el cuadro de desarrollo

En este tutorial se usa Visual Studio 2012. El proyecto se puede compilar mediante cualquier entorno de desarrollo que pueda crear una clase .NET para Windows. El proyecto debe tener como destino .NET 4.5 porque los métodos BeginAuthentication y TryEndAuthentication usan el tipo System.Security.Claims.Claim, parte de la versión 4.5 de .NET Framework. Hay una referencia necesaria para el proyecto:

Dll de referencia Dónde encontrarla Requerido para
Microsoft.IdentityServer.Web.dll El archivo dll se encuentra en %windir%\ADFS en un servidor Windows Server 2012 R2 en el que se ha instalado AD FS.

Este archivo DLL debe copiarse en la máquina de desarrollo y una referencia explícita creada en el proyecto.

Tipos de interfaz que incluyen IAuthenticationContext, IProofData

Creación del proveedor

  1. En Visual Studio 2012: elija Archivo-Nuevo> proyecto>...

  2. Seleccione Biblioteca de clases y asegúrese de que tiene como destino .NET 4.5.

    Captura de pantalla del cuadro de diálogo Nuevo proyecto que muestra la opción Biblioteca de clases seleccionada.

  3. Realice una copia de Microsoft.IdentityServer.Web.dll de %windir%\ADFS en el servidor de Windows Server 2012 R2 donde se ha instalado AD FS y péguelo en la carpeta Project de la máquina de desarrollo.

  4. En Explorador de soluciones, haga clic con el botón derecho en Referencias y agregar referencia...

  5. Vaya a la copia local de Microsoft.IdentityServer.Web.dll y Agregar...

  6. Haga clic en Aceptar para confirmar la nueva referencia:

    Captura de pantalla del cuadro de diálogo Administrador de referencias que muestra la Microsoft.IdentityServer.Web.dll seleccionada.

    Ahora debe configurarse para resolver todos los tipos necesarios para el proveedor.

  7. Agregue una nueva clase al proyecto (haga clic con el botón derecho en el proyecto, Agregar... Clase...) y asígnele un nombre como MyAdapter, que se muestra a continuación:

    Captura de pantalla del cuadro de diálogo Agregar nuevo elemento con la opción Clase seleccionada.

  8. En el nuevo archivo MyAdapter.cs, reemplace el código existente por lo siguiente:

    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. Aún no estamos listos para compilar... hay dos interfaces más para ir.

    Agregue dos clases más al proyecto: una es para los metadatos y la otra para el formulario de presentación. Puede agregarlos en el mismo archivo que la clase anterior.

    class MyMetadata : IAuthenticationAdapterMetadata
    {
    
    }
    
    class MyPresentationForm : IAdapterPresentationForm
    {
    
    }
    
  10. A continuación, puede agregar los miembros necesarios para cada uno. En primer lugar, los metadatos (con comentarios insertados útiles)

    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; }
        }
    }
    

    Ahora debería poder F12 (hacer clic con el botón derecho – Ir a definición) en IAuthenticationAdapter para ver el conjunto de miembros de interfaz necesarios.

    A continuación, puede realizar una implementación de estos.

  11. Reemplace todo el contenido de la clase por lo siguiente:

    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
            }
        }
    }
    

    A continuación, el formulario de presentación:

    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. Anote el elemento "todo" para el elemento Resources.FormPageHtml anterior. Puede corregirlo en un minuto, pero primero vamos a agregar las instrucciones de retorno necesarias finales, basadas en los tipos recién implementados, a la clase MyAdapter inicial. Para ello, agregue lo siguiente a la implementación de IAuthenticationAdapter existente:

    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. Ahora para el archivo de recursos que contiene el fragmento html. Cree un nuevo archivo de texto en la carpeta del proyecto con el siguiente contenido:

    <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. A continuación, seleccione Project-Add> Component... Archivo de recursos y asigne un nombre al archivo Recursos y haga clic en Agregar:

    Captura de pantalla del cuadro de diálogo Agregar nuevo elemento que muestra el archivo de recursos seleccionado.

  15. A continuación, en el archivo Resources.resx , elija Agregar recurso... Agregue el archivo existente. Vaya al archivo de texto (que contiene el fragmento html) que guardó anteriormente.

    Asegúrese de que el código GetFormHtml resuelve el nombre del nuevo recurso correctamente por el prefijo de nombre del archivo de recursos (archivo .resx) seguido del nombre del propio recurso:

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

Ahora debería poder compilar.

Compilación del adaptador

El adaptador debe estar integrado en un ensamblado de .NET con nombre seguro que se puede instalar en la GAC en Windows. Para lograrlo en un proyecto de Visual Studio, complete los pasos siguientes:

  1. Haga clic con el botón derecho en el nombre del proyecto en Explorador de soluciones y haga clic en Propiedades.

  2. En la pestaña Firma , active Firmar el ensamblado y elija <Nuevo...> en Elegir un archivo de clave de nombre seguro: escriba un nombre de archivo de clave y una contraseña y haga clic en Aceptar. A continuación, asegúrese de que Sign the assembly is checked (Firmar el ensamblado está activado) y Delay sign only is unchecked (Solo se desactiva el signo delay). La página De firma de propiedades debe tener este aspecto:

    compilación del proveedor

  3. A continuación, compile la solución.

Implementación del adaptador en la máquina de prueba de AD FS

Para que AD FS pueda invocar un proveedor externo, debe estar registrado en el sistema. Los proveedores de adaptadores deben proporcionar un instalador que realice las acciones de instalación necesarias, incluida la instalación en la GAC, y el instalador debe admitir el registro en AD FS. Si esto no se hace, el administrador debe ejecutar los pasos Windows PowerShell siguientes. Estos pasos se pueden usar en el laboratorio para habilitar las pruebas y la depuración.

Preparación de la máquina de AD FS de prueba

Copie archivos y agregue a GAC.

  1. Asegúrese de que tiene un equipo de Windows Server 2012 R2 o una máquina virtual.

  2. Instale el servicio de rol de AD FS y configure una granja de servidores con al menos un nodo.

    Para conocer los pasos detallados para configurar un servidor de federación en un entorno de laboratorio, consulte la guía de implementación de Windows Server 2012 R2 AD FS.

  3. Copie las herramientas de Gacutil.exe en el servidor.

    Gacutil.exe puede encontrarse en %homedrive%Program Files (x86)Microsoft SDKsWindowsv8.0AbinNETFX 4.0 Tools en un equipo Windows 8. Necesitará el propio archivo gacutil.exe y la carpeta 1033, en-US y la otra carpeta de recursos localizada debajo de la ubicación herramientas de NETFX 4.0 .

  4. Copie los archivos de proveedor (uno o varios archivos de .dll firmados con nombre seguro) en la misma ubicación de carpeta que gacutil.exe (la ubicación es solo para mayor comodidad).

  5. Agregue los archivos de .dll a la GAC en cada servidor de federación de AD FS de la granja de servidores:

    Ejemplo: uso de la herramienta de línea de comandos GACutil.exe para agregar un archivo DLL a la GAC: C:>.gacutil.exe /if .<yourdllname>.dll

    Para ver la entrada resultante en la GAC:C:>.gacutil.exe /l <yourassemblyname>

Registro del proveedor en AD FS

Una vez cumplidos los requisitos previos anteriores, abra una ventana de comandos de Windows PowerShell en el servidor de federación y escriba los siguientes comandos (tenga en cuenta que si usa la granja de servidores de federación que usa Windows Internal Database, debe ejecutar estos comandos en el servidor de federación principal de la granja de servidores):

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

    Donde YourTypeName es el nombre de tipo seguro de .NET: "YourDefaultNamespace.YourIAuthenticationAdapterImplementationClassName, YourAssemblyName, Version=YourAssemblyVersion, Culture=neutral, PublicKeyToken=YourPublicKeyTokenValue, processorArchitecture=MSIL"

    Esto registrará su proveedor externo en AD FS, con el nombre que proporcionó como AnyNameYouWish anterior.

  2. Reinicie el servicio AD FS (mediante el complemento Servicios de Windows, por ejemplo).

  3. Ejecute el siguiente comando: Get-AdfsAuthenticationProvider.

    Esto muestra a su proveedor como uno de los proveedores del sistema.

    Ejemplo:

    $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 tiene habilitado el servicio de registro de dispositivos en el entorno de AD FS, ejecute también el siguiente comando de PowerShell: net start drs

    Para comprobar el proveedor registrado, use el siguiente comando de PowerShell:Get-AdfsAuthenticationProvider

    Esto muestra a su proveedor como uno de los proveedores del sistema.

Creación de la directiva de autenticación de AD FS que invoca el adaptador

Creación de la directiva de autenticación mediante el complemento de administración de AD FS

  1. Abra el complemento Administración de AD FS (en el menú herramientas de Administrador del servidor).

  2. Haga clic en Directivas de autenticación.

  3. En el panel central, en Multi-Factor Authentication, haga clic en el vínculo Editar situado a la derecha de Configuración global.

  4. En Seleccionar métodos de autenticación adicionales en la parte inferior de la página, active la casilla adminName del proveedor. Haga clic en Aplicar.

  5. Para proporcionar un "desencadenador" para invocar MFA mediante el adaptador, en Ubicaciones , active Extranet e Intranet, por ejemplo. Haga clic en OK. (Para configurar desencadenadores por usuario de confianza, consulte "Creación de la directiva de autenticación mediante Windows PowerShell" a continuación).

  6. Compruebe los resultados mediante los siguientes comandos:

    En primer lugar, use Get-AdfsGlobalAuthenticationPolicy. Debería ver el nombre del proveedor como uno de los valores AdditionalAuthenticationProvider.

    Luego, utilice Get-AdfsAdditionalAuthenticationRule. Debería ver las reglas de Extranet e Intranet configuradas como resultado de la selección de directivas en la interfaz de usuario del administrador.

Creación de la directiva de autenticación mediante Windows PowerShell

  1. En primer lugar, habilite el proveedor en la directiva global:

    Set-AdfsGlobalAuthenticationPolicy -AdditionalAuthenticationProvider “YourAuthProviderName”`
    

    Nota

    Tenga en cuenta que el valor proporcionado para el parámetro AdditionalAuthenticationProvider corresponde al valor que proporcionó para el parámetro "Name" en el cmdlet Register-AdfsAuthenticationProvider anterior y a la propiedad "Name" de Get-AdfsAuthenticationProvider salida del cmdlet.

    Set-AdfsGlobalAuthenticationPolicy –AdditionalAuthenticationProvider “MyMFAAdapter”`
    
  2. A continuación, configure reglas específicas de usuario de confianza o globales para desencadenar MFA:

    Ejemplo 1: para crear una regla global para requerir MFA para solicitudes externas:

    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" );'
    

    Ejemplo 2: para crear reglas de MFA para requerir MFA para solicitudes externas a un usuario de confianza específico. (Nota: Los proveedores individuales no se pueden conectar a usuarios de confianza individuales en AD FS en 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" );'
    

Autenticación con MFA mediante el adaptador

Por último, realice los pasos siguientes para probar el adaptador:

  1. Asegúrese de que el tipo de autenticación principal global de AD FS está configurado como autenticación de formularios para extranet e intranet (esto facilita la autenticación como usuario específico).

    1. En el complemento AD FS, en Directivas de autenticación, en el área Autenticación principal , haga clic en Editar junto a Configuración global.

      1. O simplemente haga clic en la pestaña Principal de la interfaz de usuario de directiva multifactor .
  2. Asegúrese de que la autenticación de formularios es la única opción activada para la extranet y el método de autenticación de intranet. Haga clic en OK.

  3. Abra la página html de inicio de sesión iniciado por IDP (https://< fsname>/adfs/ls/idpinitiatedsignon.htm) e inicie sesión como un usuario de AD válido en el entorno de prueba.

  4. Escriba las credenciales para la autenticación principal.

  5. Debería ver que aparece la página de formularios de MFA con preguntas de desafío de ejemplo.

    Si tiene más de un adaptador configurado, verá la página de elección de MFA con el nombre descriptivo anterior.

    Captura de pantalla de la página de formularios de M F A con preguntas de desafío de ejemplo.

    Captura de pantalla de la página de elección de M F A.

Ahora tiene una implementación en funcionamiento de la interfaz y tiene el conocimiento de cómo funciona el modelo. Puede probar como ejemplo adicional para establecer puntos de interrupción en BeginAuthentication y TryEndAuthentication. Observe cómo se ejecuta BeginAuthentication cuando el usuario escribe por primera vez el formulario MFA, mientras que TryEndAuthentication se desencadena en cada envío del formulario.

Actualización del adaptador para la autenticación correcta

Pero espere: el adaptador de ejemplo nunca se autenticará correctamente. Esto se debe a que nada del código devuelve null para TryEndAuthentication.

Al completar los procedimientos anteriores, creó una implementación básica del adaptador y la agregó a un servidor de AD FS. Puede obtener la página de formularios MFA, pero aún no se puede autenticar porque aún no ha colocado la lógica correcta en la implementación tryEndAuthentication. Así que vamos a agregarlo.

Recuerde la implementación 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();
}

Vamos a actualizarlo para que no siempre devuelva MyPresentationForm(). Para ello, puede crear un método de utilidad simple dentro de la clase :

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;
    }
}

A continuación, actualice TryEndAuthentication como se indica a continuación:

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();
    }
}

Ahora tiene que actualizar el adaptador en el cuadro de prueba. Primero debe deshacer la directiva de AD FS, anular el registro de AD FS y reiniciar AD FS, luego quitar la .dll de la GAC y, a continuación, agregar la nueva .dll a la GAC, registrarla en AD FS, reiniciar AD FS y volver a configurar la directiva de AD FS.

Implementación y configuración del adaptador actualizado en la máquina de AD FS de prueba

Borrar directiva de AD FS

Desactive todas las casillas relacionadas con MFA en la interfaz de usuario de MFA, que se muestra a continuación, y haga clic en Aceptar.

borrar directiva

Anular el registro del proveedor (Windows PowerShell)

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

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

El valor que pasa para "Name" es el mismo valor que "Name" que proporcionó al cmdlet Register-AdfsAuthenticationProvider. También es la propiedad "Name" que es la salida de Get-AdfsAuthenticationProvider.

Antes de anular el registro de un proveedor, debe quitar el proveedor de AdfsGlobalAuthenticationPolicy (ya sea desactivando las casillas que ha activado en el complemento de administración de AD FS o mediante Windows PowerShell).

El servicio AD FS debe reiniciarse después de esta operación.

Eliminación del ensamblado de GAC

  1. En primer lugar, use el siguiente comando para buscar el nombre seguro completo de la entrada:C:>.gacutil.exe /l <yourAdapterAssemblyName>

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

  2. A continuación, use el siguiente comando para quitarlo de la GAC:.gacutil /u “<output from the above command>”

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

Adición del ensamblado actualizado a GAC

Asegúrese de pegar primero la .dll actualizada localmente. C:>.gacutil.exe /if .MFAAdapter.dll

Visualización del ensamblado en la GAC (línea cmd)

C:> .gacutil.exe /l mfaadapter

Registrar el proveedor en 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. Reinicie el servicio AD FS.

Creación de la directiva de autenticación mediante el complemento administración de AD FS

  1. Abra el complemento Administración de AD FS (en el menú Herramientas de Administrador del servidor).

  2. Haga clic en Directivas de autenticación.

  3. En Multi-Factor Authentication, haga clic en el vínculo Editar situado a la derecha de Configuración global.

  4. En Seleccionar métodos de autenticación adicionales, active la casilla adminName del proveedor. Haga clic en Aplicar.

  5. Para proporcionar un "desencadenador" para invocar MFA mediante el adaptador, en Ubicaciones, compruebe la extranet y la intranet, por ejemplo. Haga clic en OK.

Autenticación con MFA mediante el adaptador

Por último, realice los pasos siguientes para probar el adaptador:

  1. Asegúrese de que el tipo de autenticación principal global de AD FS está configurado como autenticación de formularios para extranet e intranet (esto facilita la autenticación como usuario específico).

    1. En el complemento de administración de AD FS, en Directivas de autenticación, en el área Autenticación principal , haga clic en Editar junto a Configuración global.

      1. O simplemente haga clic en la pestaña Principal de la interfaz de usuario de directiva multifactor.
  2. Asegúrese de que la autenticación de formularios es la única opción activada para la extranet y el método de autenticación de intranet . Haga clic en OK.

  3. Abra la página html de inicio de sesión iniciado por IDP (https://< fsname>/adfs/ls/idpinitiatedsignon.htm) e inicie sesión como un usuario de AD válido en el entorno de prueba.

  4. Escriba las credenciales para la autenticación principal.

  5. Debería ver que aparece la página de formularios de MFA con el texto de desafío de ejemplo.

    1. Si tiene más de un adaptador configurado, verá la página de elección de MFA con su nombre descriptivo.

Debería ver un inicio de sesión correcto al escribir adfabric en la página de autenticación de MFA.

Captura de pantalla de la página de formularios de M F A con texto de desafío de ejemplo.

Captura de pantalla de la página de inicio de sesión correcta de M F A.

Consulte también

Otros recursos

Métodos de autenticación adicionales

Administración de riesgos con la autenticación multifactor adicional para aplicaciones confidenciales