Criar um método de autenticação personalizado para AD FS no Windows ServerBuild a Custom Authentication Method for AD FS in Windows Server

Este tutorial fornece instruções para implementar um método de autenticação personalizado para AD FS no Windows Server 2012 R2.This walkthrough provides instructions for implementing a custom authentication method for AD FS in Windows Server 2012 R2. Para obter mais informações, consulte métodos de autenticação adicionais.For more information, see Additional Authentication Methods.

Aviso

O exemplo que você pode criar aqui é   apenas para fins educacionais.The example that you can build here is for educational purposes only.  Essas instruções são para a implementação mais simples e mínima possível para expor os elementos necessários do modelo.   Não há nenhum back-end de autenticação, processamento de erro ou dados de configuração. These instructions are for the simplest, most minimal implementation possible to expose the required elements of the model.  There is no authentication back end, error processing, or configuration data.

Configurando a caixa de desenvolvimentoSetting up the development box

O passo a passo usa o Visual Studio 2012.This walk-through uses Visual Studio 2012. O projeto pode ser criado usando qualquer ambiente de desenvolvimento que possa criar uma classe .NET para Windows.The project can be built using any development environment that can create a .NET class for Windows. O projeto deve ter como destino o .NET 4,5 porque os métodos BeginAuthentication e TryEndAuthentication usam o tipo System. Security. Claims. Claim, parte da .NET Framework versão 4.5. há uma referência necessária para o projeto:The project must target .NET 4.5 because the BeginAuthentication and TryEndAuthentication methods use the type System.Security.Claims.Claim, part of .NET Framework version 4.5.There is one reference required for the project:

DLL de referênciaReference dll Onde encontrá-lasWhere to find it Obrigatório paraRequired for
Microsoft.IdentityServer.Web.dllMicrosoft.IdentityServer.Web.dll A dll está localizada em% windir% ADFS em um servidor Windows Server 2012 R2 no qual o AD FS foi instalado.The dll is located in %windir%ADFS on a Windows Server 2012 R2 server on which AD FS has been installed.

Essa DLL deve ser copiada para o computador de desenvolvimento e uma referência explícita criada no projeto.This dll must be copied to the development machine and an explicit reference created in the project.

Tipos de interface, incluindo IAuthenticationContext, IProofDataInterface types including IAuthenticationContext, IProofData

Criar o provedorCreate the provider

  1. No Visual Studio 2012: escolha Arquivo->novo >projeto...In Visual Studio 2012: Choose File->New->Project...

  2. Selecione biblioteca de classes e verifique se você está direcionando para o .NET 4,5.Select Class Library and be sure you are targeting .NET 4.5.

    criar o provedorcreate the provider

  3. Faça uma cópia de Microsoft.IdentityServer.Web.dll de% windir% ADFS no servidor Windows Server 2012 R2 em que AD FS foi instalado e cole-o na pasta do projeto no computador de desenvolvimento.Make a copy of Microsoft.IdentityServer.Web.dll from %windir%ADFS on the Windows Server 2012 R2 server where AD FS has been installed and paste it in your Project folder on your development machine.

  4. Em Gerenciador de soluções, clique com o botão direito do mouse em referências e adicione referência...In Solution Explorer, right click References and Add Reference...

  5. Navegue até sua cópia local de Microsoft.IdentityServer.Web.dll e adicione...Browse to your local copy of Microsoft.IdentityServer.Web.dll and Add...

  6. Clique em OK para confirmar a nova referência:Click OK to confirm the new reference:

    criar o provedorcreate the provider

    Agora você deve estar configurado para resolver todos os tipos necessários para o provedor.You should now be set up to resolve all of the types required for the provider.

  7. Adicione uma nova classe ao seu projeto (clique com o botão direito do mouse no projeto, adicione... Classe...) e dê a ele um nome como myadapter, mostrado abaixo:Add a new class to your project (Right click your project, Add...Class...) and give it a name like MyAdapter, shown below:

    criar o provedorcreate the provider

  8. No novo arquivo MyAdapter.cs, substitua o código existente pelo seguinte:In the new file MyAdapter.cs, replace the existing code with the following:

    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. We are not ready to build yet... there are two more interfaces to go.

    Add two more classes to your project: one is for the metadata, and the other for the presentation form. You can add these within the same file as the class above.

    class MyMetadata : IAuthenticationAdapterMetadata
     {
    
     }
    
     class MyPresentationForm : IAdapterPresentationForm
     {
    
     }
    
  10. Next, you can add the required members for each.First, the metadata (with helpful inline comments)

    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; }
     }
    }
    
    
    <span data-ttu-id="3f2ca-132">Agora você deve ser capaz de F12 (clique com o botão direito do mouse em definição) em IAuthenticationAdapter para ver o conjunto de membros de interface necessários.</span><span class="sxs-lookup"><span data-stu-id="3f2ca-132">Now you should be able to F12 (right click – Go To Definition) on IAuthenticationAdapter to see the set of required interface members.</span></span>
    
    <span data-ttu-id="3f2ca-133">Em seguida, você pode fazer uma implementação simples desses.</span><span class="sxs-lookup"><span data-stu-id="3f2ca-133">Next, you can do a simple implementation of these.</span></span>
    
    
  11. Substitua todo o conteúdo de sua classe pelo seguinte:Replace the entire contents of your class with the following:

    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
            }
        }
    }
    
  12. Ainda não estamos prontos para compilar... Há mais duas interfaces a serem acessadas.We are not ready to build yet... there are two more interfaces to go.

    Adicione mais duas classes ao seu projeto: uma é para os metadados e a outra para o formulário de apresentação.Add two more classes to your project: one is for the metadata, and the other for the presentation form. Você pode adicioná-los no mesmo arquivo que a classe acima.You can add these within the same file as the class above.

    class MyMetadata : IAuthenticationAdapterMetadata
    {
    }
    class MyPresentationForm : IAdapterPresentationForm
    {
    }
    
  13. Em seguida, você pode adicionar os membros necessários para cada um. Primeiro, os metadados (com comentários embutidos úteis)Next, you can add the required members for each.First, the metadata (with helpful inline comments)

    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 languagelocale 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
    /// "https://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"
    /// "https://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; }
    }
    }
    

    Em seguida, o formulário de apresentação:Next, the presentation form:

    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";
    }
    
  14. Observe o ' todo ' para o elemento Resources. FormPageHtml acima.Note the ‘todo' for the Resources.FormPageHtml element above.

    Você pode corrigi-lo em um minuto, mas primeiro vamos adicionar as instruções de retorno finais necessárias, com base nos tipos implementados recentemente, à sua classe inicial myadapter.You can fix it in a minute, but first let's add the final required return statements, based on the newly implemented types, to your initial MyAdapter class. Para fazer isso, adicione os itens em itálico abaixo à implementação de IAuthenticationAdapter existente:To do this, add the items in Italic below to your existing IAuthenticationAdapter implementation:

    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();
    }
    
    }
    
  15. Agora, para o arquivo de recurso que contém o fragmento HTML.Now for the resource file containing the html fragment. Crie um novo arquivo de texto na pasta do projeto com o seguinte conteúdo:Create a new text file in your project folder with the following contents:

    <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>
    
  16. Em seguida, selecione **projeto- > Adicionar componente... ** Arquivo de recursos e nomeie os recursosde arquivo e clique em Adicionar:Then, select Project->Add Component... Resources file and name the file Resources, and click Add:

criar o provedorcreate the provider

  1. Em seguida, no arquivo Resources. resx , escolha Adicionar recurso... Adicionar arquivo existente.Then, within the Resources.resx file, choose Add Resource...Add existing file. Navegue até o arquivo de texto (que contém o fragmento HTML) que você salvou acima.Navigate to the text file (containing the html fragment) that you saved above.

Verifique se o código GetFormHtml resolve o nome do novo recurso corretamente pelo prefixo de nome do arquivo de recursos (arquivo. resx) seguido pelo nome do próprio recurso:Ensure your GetFormHtml code resolves the name of the new resource correctly by the resources file (.resx file) name prefix followed by the name of the resource itself:

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

Agora você deve ser capaz de criar.You should now be able to build.

Criar o adaptadorBuild the adapter

O adaptador deve ser incorporado em um assembly .NET fortemente nomeado que pode ser instalado no GAC no Windows.The adapter should be built into a strongly named .NET assembly that can be installed into the GAC in Windows. Para conseguir isso em um projeto do Visual Studio, conclua as seguintes etapas:To achieve this in a Visual Studio project, complete the following steps:

  1. Clique com o botão direito do mouse no nome do projeto em Gerenciador de Soluções e clique em Propriedades.Right click your project name in Solution Explorer and click Properties.

  2. Na guia assinatura , marque assinar o assembly e escolha <novo... > em escolher um arquivo de chave de nome forte: Insira um nome de arquivo de chave e uma senha e clique em OK.On the Signing tab, check Sign the assembly and choose <New...> under Choose a strong name key file: Enter a key file name and password and click OK. Em seguida, certifique-se de que assinar o assembly esteja marcado e a opção somente sinal de atraso esteja desmarcada.Then ensure Sign the assembly is checked and Delay sign only is unchecked. A página de assinatura de propriedades deve ter esta aparência:The properties Signing page should look like this:

    compilar o provedorbuild the provider

  3. Em seguida, Compile a solução.Then build the solution.

Implantar o adaptador em seu computador de teste de AD FSDeploy the adapter to your AD FS test machine

Antes que um provedor externo possa ser invocado pelo AD FS, ele deve ser registrado no sistema.Before an external provider can be invoked by AD FS, it must be registered in the system. Os provedores de adaptador devem fornecer um instalador que executa as ações de instalação necessárias, incluindo a instalação no GAC, e o instalador deve dar suporte ao registro no AD FS.Adapter providers must provide an installer which performs the necessary installation actions including installation in the GAC, and the installer must support registration in AD FS. Se isso não for feito, o administrador precisará executar as etapas do Windows PowerShell abaixo.If that is not done, the administrator needs to execute the Windows PowerShell steps below. Essas etapas podem ser usadas no laboratório para habilitar o teste e a depuração.These steps can be used in the lab to enable testing and debugging.

Preparar o computador de AD FS de testePrepare the test AD FS machine

Copie os arquivos e adicione-o ao GAC.Copy files and add to GAC.

  1. Verifique se você tem um computador com Windows Server 2012 R2 ou uma máquina virtual.Ensure you have a Windows Server 2012 R2 computer or virtual machine.

  2. Instale o AD FS serviço de função e configure um farm com pelo menos um nó.Install the AD FS role service and configure a farm with at least one node.

    Para obter etapas detalhadas para configurar um servidor de Federação em um ambiente de laboratório, consulte o Guia de implantação do Windows server 2012 R2 AD FS.For detailed steps to setup a federation server in a lab environment, see the Windows Server 2012 R2 AD FS Deployment Guide.

  3. Copie as ferramentas de Gacutil.exe para o servidor.Copy the Gacutil.exe tools to the server.

    Gacutil.exe pode ser encontrado em % HomeDrive% Program Files (x86) Microsoft sdkswindowsv 8.0 abinnetfx 4,0 Tools em um computador com o Windows 8.Gacutil.exe can be found in %homedrive%Program Files (x86)Microsoft SDKsWindowsv8.0AbinNETFX 4.0 Tools on a Windows 8 machine. Você precisará do próprio arquivo de gacutil.exe , bem como o 1033, en-USe a outra pasta de recursos localizados abaixo do local das ferramentas NETFX 4,0 .You will need the gacutil.exe file itself as well as the 1033, en-US, and the other localized resource folder below the NETFX 4.0 Tools location.

  4. Copie seus arquivos de provedor (um ou mais arquivos. dll assinados com nome forte) para o mesmo local de pasta que gacutil.exe (o local é apenas para conveniência)Copy your provider file(s) (one or more strong name signed .dll files) to the same folder location as gacutil.exe (the location is just for convenience)

  5. Adicione seus arquivos. dll ao GAC em cada AD FS servidor de Federação no farm:Add your .dll file(s) to the GAC on each AD FS federation server in the farm:

    Exemplo: usando a ferramenta de linha de comando GACutil.exe para adicionar uma dll ao GAC: C:>.gacutil.exe /if .<yourdllname>.dllExample: using command line tool GACutil.exe to add a dll to the GAC: C:>.gacutil.exe /if .<yourdllname>.dll

    Para exibir a entrada resultante no GAC:C:>.gacutil.exe /l <yourassemblyname>To view the resulting entry in the GAC:C:>.gacutil.exe /l <yourassemblyname>

Registrar seu provedor no AD FSRegister your provider in AD FS

Depois que os pré-requisitos acima forem atendidos, abra uma janela de comando do Windows PowerShell no servidor de Federação e insira os seguintes comandos (Observe que se você estiver usando o farm de servidores de Federação que usa o banco de dados interno do Windows, execute estes comandos no servidor de Federação primário do farm):Once the above pre-requisites are met, open a Windows PowerShell command window on your federation server and enter the following commands (note that if you are using federation server farm that uses Windows Internal Database, you must execute these commands on the primary federation server of the farm):

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

    Em que YourTypeName é o nome do tipo forte do .NET: "YourDefaultNamespace. YourIAuthenticationAdapterImplementationClassName, YourAssemblyName, Version = YourAssemblyVersion, Culture = neutral, PublicKeyToken = YourPublicKeyTokenValue, processorArchitecture = MSIL"Where YourTypeName is your .NET strong type name: "YourDefaultNamespace.YourIAuthenticationAdapterImplementationClassName, YourAssemblyName, Version=YourAssemblyVersion, Culture=neutral, PublicKeyToken=YourPublicKeyTokenValue, processorArchitecture=MSIL"

    Isso registrará seu provedor externo no AD FS, com o nome fornecido como AnyNameYouWish acima.This will register your external provider in AD FS, with the Name you provided as AnyNameYouWish above.

  2. Reinicie o serviço de AD FS (usando o snap-in Serviços do Windows, por exemplo).Restart the AD FS service (using the Windows Services snap-in, for example).

  3. Execute o seguinte comando: Get-AdfsAuthenticationProvider.Run the following command: Get-AdfsAuthenticationProvider.

    Isso mostra seu provedor como um dos provedores no sistema.This shows your provider as one of the providers in the system.

    Exemplo:Example:

    $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
    

    Se você tiver o serviço de registro de dispositivo habilitado em seu ambiente de AD FS, também execute o seguinte comando do PowerShell: net start drsIf you have the device registration service enabled in your AD FS environment, also execute the following PowerShell command: net start drs

    Para verificar o provedor registrado, use o seguinte comando do PowerShell: Get-AdfsAuthenticationProvider .To verify the registered provider, use the following PowerShell command:Get-AdfsAuthenticationProvider.

    Isso mostra seu provedor como um dos provedores no sistema.This shows your provider as one of the providers in the system.

Criar a política de autenticação AD FS que invoca o adaptadorCreate the AD FS authentication policy that invokes your adapter

Criar a política de autenticação usando o snap-in de gerenciamento de AD FSCreate the authentication policy using the AD FS Management snap-in

  1. Abra o snap-in de gerenciamento de AD FS (no menu ferramentas do Gerenciador do servidor).Open the AD FS Management snap-in (from the Server Manager Tools menu).

  2. Clique em políticas de autenticação.Click Authentication Policies.

  3. No painel central, em autenticação multifator, clique no link Editar à direita das configurações globais.In the center pane, under Multi-Factor Authentication, click the Edit link to the right of Global Settings.

  4. Em Selecionar métodos de autenticação adicionais na parte inferior da página, marque a caixa para o adminname do seu provedor.Under Select additional authentication methods at the bottom of the page, check the box for your provider's AdminName. Clique em Aplicar.Click Apply.

  5. Para fornecer um "gatilho" para invocar o MFA usando o adaptador, em locais , verifique a extranet e a intranet, por exemplo.To provide a “trigger” to invoke MFA using your adapter, under Locations check both Extranet and Intranet, for example. Clique em OK.Click OK. (Para configurar gatilhos por terceira parte confiável, consulte "criar a política de autenticação usando o Windows PowerShell" abaixo.)(To configure triggers per relying party, see “Create the authentication policy using Windows PowerShell” below.)

  6. Verifique os resultados usando os seguintes comandos:Check the results using the following commands:

    Primeiro uso Get-AdfsGlobalAuthenticationPolicy .First use Get-AdfsGlobalAuthenticationPolicy. Você deve ver o nome do provedor como um dos valores de AdditionalAuthenticationProvider.You should see your provider Name as one of the AdditionalAuthenticationProvider values.

    Em seguida, use Get-AdfsAdditionalAuthenticationRule .Then use Get-AdfsAdditionalAuthenticationRule. Você deve ver as regras para extranet e intranet configuradas como resultado de sua seleção de política na interface do usuário do administrador.You should see the rules for Extranet and Intranet configured as a result of your policy selection in the administrator UI.

Criar a política de autenticação usando o Windows PowerShellCreate the authentication policy using Windows PowerShell

  1. Primeiro, habilite o provedor na política global:First, enable the provider in global policy:

    Set-AdfsGlobalAuthenticationPolicy -AdditionalAuthenticationProvider “YourAuthProviderName”`
    

    Observação

    Observe que o valor fornecido para o parâmetro AdditionalAuthenticationProvider corresponde ao valor fornecido para o parâmetro "Name" no cmdlet Register-AdfsAuthenticationProvider acima e à propriedade "Name" da saída do cmdlet Get-AdfsAuthenticationProvider.Note that the value provided for the AdditionalAuthenticationProvider parameter corresponds to the value you provided for the “Name” parameter in the Register-AdfsAuthenticationProvider cmdlet above and to the “Name” property from Get-AdfsAuthenticationProvider cmdlet output.

    Set-AdfsGlobalAuthenticationPolicy –AdditionalAuthenticationProvider “MyMFAAdapter”`
    
  2. Em seguida, configure regras globais ou de terceira parte confiável para disparar MFA:Next, configure global or relying-party-specific rules to trigger MFA:

    Exemplo 1: para criar uma regra global para exigir MFA para solicitações externas:Example 1: to create global rule to require MFA for External requests:

    PS C:\>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" );'
    

    Exemplo 2: para criar regras de MFA para exigir MFA para solicitações externas para uma terceira parte confiável específica.Example 2: to create MFA rules to require MFA for external requests to a specific relying party. (Observe que os provedores individuais não podem ser conectados a partes confiáveis individuais no AD FS no Windows Server 2012 R2).(Note that individual providers cannot be connected to individual relying parties in AD FS in Windows Server 2012 R2).

    PS C:\>$rp = Get-AdfsRelyingPartyTrust –Name <Relying Party Name>
    PS C:\>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" );'
    

Autenticar com o MFA usando seu adaptadorAuthenticate with MFA using your adapter

Por fim, execute as etapas abaixo para testar seu adaptador:Finally, perform the steps below to test your adapter:

  1. Verifique se o tipo de autenticação primária global AD FS está configurado como autenticação de formulários para extranet e intranet (isso torna sua demonstração mais fácil de autenticar como um usuário específico)Ensure the AD FS global Primary authentication type is configured as Forms Authentication for both Extranet and Intranet (this makes your demo easier to authenticate as a specific user)

    1. No snap-in AD FS, em políticas de autenticação, na área autenticação primária , clique em Editar ao lado de configurações globais.In the AD FS snap-in, under Authentication Policies, in the Primary Authentication area, click Edit next to Global Settings.

      1. Ou simplesmente clique na guia primário da interface do usuário da diretiva multifator .Or just click the Primary tab from the Multi-factor policy UI.
  2. Verifique se a autenticação de formulários é a única opção verificada para a extranet e o método de autenticação de intranet.Ensure Forms Authentication is the only option checked for both the Extranet and the Intranet authentication method. Clique em OK.Click OK.

  3. Abra a página HTML de logon iniciada pelo IDP (https:// /adfs/ls/idpinitiatedsignon.htm) e entre como um usuário válido do AD em seu ambiente de teste.Open the IDP initiated sign-on html page (https:///adfs/ls/idpinitiatedsignon.htm) and sign in as a valid AD user in your test environment.

  4. Insira as credenciais para a autenticação primária.Enter credentials for primary authentication.

  5. Você deve ver a página de formulários do MFA com exemplos de perguntas de desafio.You should see the MFA forms page with example challenge questions appear.

    Se você tiver mais de um adaptador configurado, verá a página de escolha do MFA com seu nome amigável acima.If you have more than one adapter configured, you will see the MFA choice page with your friendly name from above.

    autenticar com adaptadorauthenticate with adapter

    autenticar com adaptadorauthenticate with adapter

Agora você tem uma implementação funcional da interface e tem o conhecimento de como o modelo funciona.You now have a working implementation of the interface and you have the knowledge of how the model works. Você pode Trym como um exemplo extra para definir pontos de interrupção no BeginAuthentication, bem como o TryEndAuthentication.You can trym as an extra example to set break points in the BeginAuthentication as well as the TryEndAuthentication. Observe como o BeginAuthentication é executado quando o usuário entra pela primeira vez no formulário MFA, enquanto o TryEndAuthentication é disparado em cada envio do formulário.Notice how BeginAuthentication is executed when the user first enters the MFA form, whereas TryEndAuthentication is triggered at each Submit of the form.

Atualizar o adaptador para autenticação bem-sucedidaUpdate the adapter for successful authentication

Mas espere – o adaptador de exemplo nunca será autenticado com êxito!But wait – your example adapter will never successfully authenticate! Isso ocorre porque nada em seu código retorna NULL para TryEndAuthentication.This is because nothing in your code returns null for TryEndAuthentication.

Ao concluir os procedimentos acima, você criou uma implementação básica de adaptador e a adicionou a um servidor AD FS.By completing the procedures above, you created a basic adapter implementation and added it to an AD FS server. Você pode obter a página de formulários do MFA, mas ainda não pode ser autenticado porque você ainda não colocou a lógica correta em sua implementação do TryEndAuthentication.You can get the MFA forms page, but you cannot yet authenticated because you have not yet put the correct logic in your TryEndAuthentication implementation. Então, vamos adicionar isso.So let's add that.

Lembre-se da implementação do TryEndAuthentication:Recall your TryEndAuthentication implementation:

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 atualizá-lo para que ele nem sempre retorne MyPresentationForm ().Let's update it so it doesn't always return MyPresentationForm(). Para isso, você pode criar um método utilitário simples dentro de sua classe:For this you can create one simple utility method within your class:

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

Em seguida, atualize TryEndAuthentication como mostrado abaixo:Then, update TryEndAuthentication as below:

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

Agora você precisa atualizar o adaptador na caixa de teste.Now you have to update the adapter on the test box. Você deve primeiro desfazer a política de AD FS, em seguida, cancelar o registro de AD FS e reiniciar AD FS, em seguida, remover o. dll do GAC e, em seguida, adicionar o New. dll ao GAC e, em seguida, registrá-lo em AD FS, reiniciar AD FS e reconfigurar a política de AD FS.You must first undo the AD FS policy, then un-register from AD FS and restart AD FS, then remove the .dll from the GAC, then add the new .dll to the GAC, then register it in AD FS, restart AD FS, and re-configure AD FS policy.

Implantar e configurar o adaptador atualizado em seu computador de AD FS de testeDeploy and configure the updated adapter on your test AD FS machine

Limpar política de AD FSClear AD FS Policy

Desmarque todas as caixas de seleção relacionadas à MFA na interface do usuário do MFA, mostrada abaixo e clique em OK.Clear all MFA related checkboxes in the MFA UI, shown below, then click OK.

limpar políticaclear policy

Cancelar registro do provedor (Windows PowerShell)Unregister provider (Windows PowerShell)

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

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

Observe que o valor que você passa para "Name" é o mesmo valor que o "Name" fornecido ao cmdlet Register-AdfsAuthenticationProvider.Note that the value you pass for “Name” is the same value as “Name” you provided to the Register-AdfsAuthenticationProvider cmdlet. Também é a propriedade "Name" que é saída de Get-AdfsAuthenticationProvider.It is also the “Name” property that is output from Get-AdfsAuthenticationProvider.

Observe que, antes de cancelar o registro de um provedor, você deve remover o provedor do AdfsGlobalAuthenticationPolicy (desmarcando as caixas de seleção nas quais você fez o check-in AD FS Management ou usando o Windows PowerShell.)Note that before you unregister a provider, you must remove the provider from the AdfsGlobalAuthenticationPolicy (either by clearing the checkboxes you checked in AD FS management snap-in or by using Windows PowerShell.)

Observe que o serviço de AD FS deve ser reiniciado após essa operação.Note that the AD FS service must be restarted after this operation.

Remover assembly do GACRemove assembly from GAC

  1. Primeiro, use o seguinte comando para encontrar o nome forte totalmente qualificado da entrada:C:>.gacutil.exe /l <yourAdapterAssemblyName>First, use the following command to find the fully qualified strong name of the entry:C:>.gacutil.exe /l <yourAdapterAssemblyName>

    Exemplo:C:>.gacutil.exe /l mfaadapterExample:C:>.gacutil.exe /l mfaadapter

  2. Em seguida, use o seguinte comando para removê-lo do GAC:.gacutil /u “<output from the above command>”Then, use the following command to remove it from the GAC:.gacutil /u “<output from the above command>”

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

Adicionar o assembly atualizado ao GACAdd the updated assembly to GAC

Certifique-se de colar o. dll atualizado primeiro.Make sure you paste the updated .dll locally first. C:>.gacutil.exe /if .MFAAdapter.dll

Exibir assembly no GAC (linha de comando)View assembly in the GAC (cmd line)

C:> .gacutil.exe /l mfaadapter

Registrar seu provedor no AD FSRegister your provider in 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 o serviço do AD FS.Restart the AD FS service.

Criar a política de autenticação usando o snap-in de gerenciamento de AD FSCreate the authentication policy using the AD FS Management snap-in

  1. Abra o snap-in de gerenciamento de AD FS (no menu ferramentas do Gerenciador do servidor).Open the AD FS Management snap-in (from the Server Manager Tools menu).

  2. Clique em políticas de autenticação.Click Authentication Policies.

  3. Em autenticação multifator, clique no link Editar à direita de configurações globais.Under Multi-Factor Authentication, click the Edit link to the right of Global Settings.

  4. Em Selecionar métodos de autenticação adicionais, marque a caixa para o adminname do seu provedor.Under Select additional authentication methods, check the box for your provider's AdminName. Clique em Aplicar.Click Apply.

  5. Para fornecer um "gatilho" para invocar o MFA usando o adaptador, em locais, verifique a extranet e a intranet, por exemplo.To provide a “trigger” to invoke MFA using your adapter, under Locations check both Extranet and Intranet, for example. Clique em OK.Click OK.

Autenticar com o MFA usando seu adaptadorAuthenticate with MFA using your adapter

Por fim, execute as etapas abaixo para testar seu adaptador:Finally, perform the steps below to test your adapter:

  1. Verifique se o tipo de autenticação primária global AD FS está configurado como autenticação de formulários para extranet e intranet (isso torna mais fácil a autenticação como um usuário específico).Ensure the AD FS global Primary authentication type is configured as Forms Authentication for both Extranet and Intranet (this makes it easier to authenticate as a specific user).

    1. No snap-in de gerenciamento de AD FS, em políticas de autenticação, na área autenticação primária , clique em Editar ao lado de configurações globais.In the AD FS management snap-in, under Authentication Policies, in the Primary Authentication area, click Edit next to Global Settings.

      1. Ou simplesmente clique na guia primário da interface do usuário da diretiva multifator.Or just click the Primary tab from the Multi-factor policy UI.
  2. Verifique se a autenticação de formulários é a única opção verificada para a extranet e o método de autenticação de intranet .Ensure Forms Authentication is the only option checked for both the Extranet and the Intranet authentication method. Clique em OK.Click OK.

  3. Abra a página HTML de logon iniciada pelo IDP (https:// /adfs/ls/idpinitiatedsignon.htm) e entre como um usuário válido do AD em seu ambiente de teste.Open the IDP initiated sign-on html page (https:///adfs/ls/idpinitiatedsignon.htm) and sign in as a valid AD user in your test environment.

  4. Insira as credenciais para autenticação primária.Enter the credentials for primary authentication.

  5. Você deve ver a página de formulários do MFA com o exemplo de texto de desafio exibido.You should see the MFA forms page with example challenge text appear.

    1. Se você tiver mais de um adaptador configurado, verá a página de escolha do MFA com seu nome amigável.If you have more than one adapter configured, you will see the MFA choice page with your friendly name.

Você deverá ver uma entrada bem-sucedida ao inserir "adfabric" na página de autenticação do MFA.You should see a successful sign-in when entering “adfabric” at the MFA authentication page.

entrar com adaptadorsign in with adapter

entrar com adaptadorsign in with adapter

Consulte TambémSee Also

Outros recursosOther Resources

Métodos de autenticação adicionais Gerencie riscos com autenticação multifator adicional para aplicativos confidenciaisAdditional Authentication Methods Manage Risk with Additional Multi-Factor Authentication for Sensitive Applications