Creació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 posible para exponer los elementos necesarios del modelo.  No incluye back-end de autenticación, procesamiento de errores ni datos de configuración.

Configuración del equipo de desarrollo

En este tutorial se usa Visual Studio 2012. El proyecto se puede compilar en cualquier entorno de desarrollo que pueda crear una clase de .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, que forma parte de .NET Framework 4.5. Hay una referencia que es necesaria para el proyecto:

dll de referencia Dónde encontrarla Requerido para
Microsoft.IdentityServer.Web.dll El archivo .dll se encuentra en la carpeta %windir%\ADFS de 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 debe crearse una referencia explícita en el proyecto.

Tipos de interfaz, como IAuthenticationContext y IProofData.

Creación del proveedor

  1. En Visual Studio 2012, elija Archivo->Nuevo->Proyecto...

  2. Seleccione Biblioteca de clases y asegúrese de que el destino es .NET 4.5.

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

  3. Realice una copia de Microsoft.IdentityServer.Web.dll, que está en la carpeta %windir%\ADFS del servidor Windows Server 2012 R2 donde se ha instalado AD FS, y péguela en la carpeta Proyecto de la máquina de desarrollo.

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

  5. Busque la copia local de Microsoft.IdentityServer.Web.dll y elija Agregar...

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

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

    Ahora debe poder 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 y elija Agregar... Clase...) y asígnele un nombre como MyAdapter, como se muestra a continuación:

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

  8. En el nuevo archivo MyAdapter.cs, reemplace el código 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 el proyecto..., quedan dos interfaces más.

    Agregue dos clases más al proyecto: una para los metadatos y otra para el formulario de presentación. Puede agregarlas 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 una. 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 debe poder presionar F12 (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 implementarlos.

  11. Reemplace todo el contenido de la clase por el siguiente código.

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

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

    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 Proyecto->Agregar componente... Archivo de recursos. Asigne el nombre Recursos al archivo y haga clic en Agregar.

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

  15. Después, en el archivo Resources.resx, elija Agregar recurso... Agregar archivo existente. Vaya al archivo de texto (que contiene el fragmento html) que guardó antes.

    Asegúrese de que el código GetFormHtml resuelve el nombre del nuevo recurso correctamente como 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 ya puede compilarlo.

Compilación del adaptador

El adaptador debe estar integrado en un ensamblado de .NET con nombre seguro que se pueda instalar en la GAC en Windows. Para lograr esto en un proyecto de Visual Studio, siga estos pasos:

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

  2. En la pestaña Firma, active Firmar el ensamblado y elija <Nuevo...> en Elija 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 la casilla Firmar el ensamblado está activada y la casilla Retrasar firma solo está desactivada. La página de propiedades Firma debe tener el siguiente aspecto:

    build the provider

  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 lleve a cabo 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 realizar los siguientes pasos en Windows PowerShell. Estos pasos se pueden usar en el laboratorio para posibilitar las pruebas y la depuración.

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

Copie los archivos y agréguelos a la GAC.

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

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

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

  3. Copie la herramienta Gacutil.exe en el servidor.

    Gacutil.exe se encuentra en %homedrive%Archivos de programa (x86)Microsoft SDKsWindowsv8.0AbinNETFX 4.0 Tools en una máquina con Windows 8. Necesitará el propio archivo gacutil.exe y la carpeta 1033, en-US, y la carpeta de los recursos localizados que se encuentra en NETFX 4.0 Tools.

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

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

    Ejemplo: Uso de la herramienta de la 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 satisfechos los requisitos previos, 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 una granja de servidores de federación que utiliza Windows Internal Database, debe ejecutar estos comandos en el servidor de federación principal de la granja):

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

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

    Esto registra el proveedor externo en AD FS, con el nombre que proporcionó antes como AnyNameYouWish.

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

  3. Ejecute el siguiente comando: Get-AdfsAuthenticationProvider.

    Esto muestra el 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, utilice el siguiente comando de PowerShell: Get-AdfsAuthenticationProvider.

    Esto muestra el proveedor como uno de los proveedores del sistema.

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

Creación de la directiva de autenticación con el complemento Administración de AD FS

  1. Abra el complemento Administración de AD FS (desde el menú Herramientas del 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 al final de la página, seleccione la casilla del nombre de administrador del proveedor. Haga clic en Aplicar.

  5. Para proporcionar un "desencadenador" que invoque a MFA usando el adaptador, en Ubicaciones, seleccione las opciones 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 con Windows PowerShell" a continuación.

  6. Compruebe los resultados con los siguientes comandos:

    En primer lugar, use Get-AdfsGlobalAuthenticationPolicy. Debe aparecer el nombre del proveedor como uno de los valores AdditionalAuthenticationProvider.

    Luego, utilice Get-AdfsAdditionalAuthenticationRule. Deben aparecer las reglas de extranet e intranet configuradas como resultado de la selección de directiva en la interfaz de usuario del administrador.

Creación de la directiva de autenticación con 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ó antes para el parámetro "Name" en el cmdlet Register-AdfsAuthenticationProvider y a la propiedad "Name" de la salida del cmdlet Get-AdfsAuthenticationProvider.

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

    Ejemplo 1. Creación de una regla global que requiera 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: Creación de reglas que requieran MFA para solicitudes externas de un usuario de confianza específico. Nota: No se pueden conectar proveedores individuales 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, siga los pasos que se indican a continuación 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 la extranet y la intranet. Esto facilita la autenticación como un 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 la directiva multifactor.
  2. Asegúrese de que Autenticación de formularios es la única opción seleccionada para el método de autenticación de la extranet y la intranet. Haga clic en OK.

  3. Abra la página HTML de inicio de sesión iniciado por el 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. Debe aparecer 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 opciones de MFA con el nombre descriptivo anterior.

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

    Screenshot of the the M F A choice page.

Ahora tiene una implementación de la interfaz en funcionamiento y sabe cómo funciona el modelo. Como ejemplo adicional, puede probar a establecer puntos de interrupción en BeginAuthentication y TryEndAuthentication. Vea cómo se ejecuta BeginAuthentication cuando el usuario entra por primera vez en el formulario de MFA, mientras que TryEndAuthentication se desencadena en cada envío del formulario.

Actualización del adaptador para una autenticación satisfactoria

Pero, espere, el adaptador de ejemplo nunca se autenticará satisfactoriamente. Esto se debe a que nada en el código devuelve null para TryEndAuthentication.

Con los procedimientos anteriores, ha creado una implementación de adaptador básica y la ha agregado a un servidor de AD FS. Puede obtener la página de formularios de MFA, pero aún no se puede autenticar porque no ha puesto todavía la lógica correcta en la implementación de TryEndAuthentication. Así que vamos a agregarla.

Recuerde la implementación de 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 actualizarla para que no siempre devuelva MyPresentationForm(). Para ello, puede crear un sencillo método de utilidad 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;
    }
}

Después, 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 equipo de prueba. Primero debe deshacer la directiva de AD FS y, después, anular el registro de AD FS, reiniciar AD FS y quitar el archivo .dll de la GAC. A continuación, agregue el nuevo archivo .dll a la GAC, regístrelo en AD FS, reinicie AD FS y vuelva a configurar la directiva de AD FS.

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

Eliminación de la 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.

clear policy

Anulación del 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 proporcionó para "Name" en el cmdlet Register-AdfsAuthenticationProvider. También es la propiedad "Name" que se genera con 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 Administración de AD FS o usando Windows PowerShell).

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

Eliminación del ensamblado de la GAC

  1. En primer lugar, utilice 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, utilice 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 la GAC

Asegúrese de pegar primero el archivo .dll actualizado en una ubicación local. C:>.gacutil.exe /if .MFAAdapter.dll

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

C:> .gacutil.exe /l mfaadapter

Registro del 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 con el complemento Administración de AD FS

  1. Abra el complemento Administración de AD FS (desde el menú Herramientas del 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, seleccione la casilla del nombre de administrador del proveedor. Haga clic en Aplicar.

  5. Para proporcionar un "desencadenador" que invoque a MFA usando el adaptador, en Ubicaciones, seleccione las opciones Extranet e Intranet, por ejemplo. Haga clic en OK.

Autenticación con MFA mediante el adaptador

Por último, siga los pasos que se indican a continuación 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 la extranet y la intranet (esto facilita la autenticación como un 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 la directiva multifactor.
  2. Asegúrese de que Autenticación de formularios es la única opción seleccionada para el método de autenticación de la extranet y la intranet. Haga clic en OK.

  3. Abra la página HTML de inicio de sesión iniciado por el 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. Debe aparecer la página de formularios de MFA con texto de desafío de ejemplo.

    1. Si tiene más de un adaptador configurado, verá la página de opciones de MFA con el nombre descriptivo.

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

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

Screenshot of the M F A successful sign in page.

Consulte también

Otros recursos

Métodos de autenticación adicionales

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