Поделиться через


Создание пользовательского метода проверки подлинности для AD FS в Windows Server

В этом пошаговом руководстве приведены инструкции по реализации пользовательского метода проверки подлинности для AD FS в Windows Server 2012 R2. Дополнительные сведения см. в разделе "Дополнительные методы проверки подлинности".

Warning

Пример, который можно создать здесь, предназначен только для образовательных целей.  Эти инструкции предназначены для самой простой, минимальной реализации, возможной для предоставления необходимых элементов модели.  Отсутствует система аутентификации, обработка ошибок и конфигурационные данные.

Настройка поля разработки

В этом пошаговом руководстве используется Visual Studio 2012. Проект можно создать с помощью любой среды разработки, которая может создать класс .NET для Windows. 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. Для проекта требуется одна ссылка:

Reference dll Расположение Required for
Microsoft.IdentityServer.Web.dll Библиотека DLL находится в %windir%\ADFS на сервере Windows Server 2012 R2, на котором установлен AD FS.

Эту библиотеку dll необходимо скопировать на компьютер для разработки и создать на нее явную ссылку в проекте.

Типы интерфейсов, включая IAuthenticationContext, IProofData

Создание поставщика

  1. В Visual Studio 2012: выберите Файл->Создать->Проект...

  2. Выберите библиотеку классов и убедитесь, что вы нацелены на .NET 4.5.

    Снимок экрана: диалоговое окно

  3. 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. In Solution Explorer, right click References and Add Reference...

  5. Browse to your local copy of Microsoft.IdentityServer.Web.dll and Add...

  6. Click OK to confirm the new reference:

    Снимок экрана: диалоговое окно диспетчера ссылок с выбранным Microsoft.IdentityServer.Web.dll.

    Теперь вы должны быть настроены на разрешение всех типов, необходимых для поставщика.

  7. Add a new class to your project (Right click your project, Add...Class...) and give it a name like MyAdapter, shown below:

    Снимок экрана: диалоговое окно

  8. В новом файле MyAdapter.cs замените существующий код следующим образом:

    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. Мы еще не готовы строить... осталось еще два интерфейса.

    Добавьте в проект еще два класса: один — для метаданных, а другой — для формы презентации. Их можно добавить в тот же файл, что и приведенный выше класс.

    class MyMetadata : IAuthenticationAdapterMetadata
    {
    
    }
    
    class MyPresentationForm : IAdapterPresentationForm
    {
    
    }
    
  10. Затем можно добавить необходимые элементы для каждого из них. Во-первых, метаданные (с полезными встроенными комментариями)

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

    Теперь вы должны иметь возможность нажать F12 (щелкните правой кнопкой мыши — перейти к определению) на IAuthenticationAdapter, чтобы просмотреть список обязательных членов интерфейса.

    Затем можно выполнить реализацию этих действий.

  11. Замените все содержимое класса следующим образом:

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

    Затем форма презентации:

    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. Note the 'todo' for the Resources.FormPageHtml element above. Вы можете быстро это исправить, но сначала давайте добавим окончательные необходимые инструкции возврата на основе недавно реализованных типов в ваш начальный класс MyAdapter. Для этого добавьте следующее в существующую реализацию 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. Теперь для файла ресурсов, содержащего html-фрагмент. Создайте текстовый файл в папке проекта со следующим содержимым:

    <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. Затем выберите файл Project->Add Component... Resources, назовите его "Ресурсы" и нажмите "Добавить".

    Снимок экрана: диалоговое окно

  15. Then, within the Resources.resx file, choose Add Resource...Add existing file. Перейдите в текстовый файл (содержащий фрагмент HTML), сохраненный выше.

    Убедитесь, что код GetFormHtml правильно распознает имя нового ресурса по префиксу имени файла ресурсов (.resx) и имени самого ресурса.

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

Теперь вы можете строить.

Создание адаптера

Адаптер должен быть встроен в строго именованную сборку .NET, которую можно установить в GAC в Windows. Чтобы достичь этого в проекте Visual Studio, выполните следующие действия.

  1. Right click your project name in Solution Explorer and click Properties.

  2. 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. Затем убедитесь, что установлен флажок "Подписать сборку", а флажок "Задержка" снят. The properties Signing page should look like this:

    сборка поставщика сборка поставщика

  3. Затем создайте решение.

Развертывание адаптера на тестовом компьютере AD FS

Прежде чем внешний поставщик может вызываться AD FS, он должен быть зарегистрирован в системе. Поставщики адаптеров должны предоставить установщик, который выполняет необходимые действия установки, включая установку в GAC, и установщик должен поддерживать регистрацию в AD FS. Если это не сделано, администратору необходимо выполнить приведенные ниже действия Windows PowerShell. Эти шаги можно использовать в лаборатории для включения тестирования и отладки.

Подготовка тестового компьютера AD FS

Скопируйте файлы и добавьте в GAC.

  1. Убедитесь, что у вас есть компьютер Windows Server 2012 R2 или виртуальная машина.

  2. Установите службу ролей AD FS и настройте ферму по крайней мере с одним узлом.

    Подробные инструкции по настройке сервера федерации в лабораторной среде см. в руководстве по развертыванию Windows Server 2012 R2 AD FS.

  3. Скопируйте средства Gacutil.exe на сервер.

    Gacutil.exe можно найти в инструментах%homedrive%Program Files (x86)Microsoft SDKsWindowsv8.0AbinNETFX 4.0 на машине с Windows 8. You will need the gacutil.exe file itself and the 1033, en-US, and the other localized resource folder below the NETFX 4.0 Tools location.

  4. 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. Добавьте свои файл(ы) .dll в GAC на каждом сервере федерации AD FS в ферме:

    Пример: использование средства командной строки GACutil.exe для добавления библиотеки DLL в GAC: C:>.gacutil.exe /if .<yourdllname>.dll

    Чтобы просмотреть результирующую запись в GAC:C:>.gacutil.exe /l <yourassemblyname>

Регистрация поставщика в AD FS

После выполнения указанных выше предварительных требований откройте окно командной строки Windows PowerShell на сервере федерации и введите следующие команды (обратите внимание, что если используется ферма серверов федерации, использующая внутреннюю базу данных Windows, необходимо выполнить эти команды на сервере федерации основного сервера федерации фермы):

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

    Где YourTypeName — это жесткое имя типа .NET: "YourDefaultNamespace.YourIAuthenticationAdapterImplementationClassName, YourAssemblyName, Version=YourAssemblyVersion, Culture=neutral, PublicKeyToken=YourPublicKeyTokenValue, processorArchitecture=MSIL"

    Ваш внешний поставщик будет зарегистрирован в AD FS с именем, указанным выше как AnyNameYouWish.

  2. Перезапустите службу AD FS (например, с помощью оснастки служб Windows).

  3. Выполните следующую команду: Get-AdfsAuthenticationProvider.

    Ваша компания отображается как один из поставщиков в системе.

    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
    

    Если в среде AD FS включена служба регистрации устройств, выполните следующую команду PowerShell: net start drs

    Чтобы проверить зарегистрированного поставщика, используйте следующую команду PowerShell:Get-AdfsAuthenticationProvider.

    Ваша компания отображается как один из поставщиков в системе.

Создайте политику аутентификации AD FS, которая вызывает адаптер.

Создайте политику проверки подлинности с помощью оснастки управления AD FS

  1. Open the AD FS Management snap-in (from the Server Manager Tools menu).

  2. Click Authentication Policies.

  3. In the center pane, under Multi-Factor Authentication, click the Edit link to the right of Global Settings.

  4. В разделе "Выбор дополнительных методов проверки подлинности " в нижней части страницы установите флажок "AdminName" вашего поставщика. Click Apply.

  5. To provide a “trigger” to invoke MFA using your adapter, under Locations check both Extranet and Intranet, for example. Click OK. (Чтобы настроить триггеры для проверяющей стороны, см. статью "Создание политики проверки подлинности с помощью Windows PowerShell" ниже.

  6. Проверьте результаты с помощью следующих команд:

    Сначала используйте Get-AdfsGlobalAuthenticationPolicy. Имя поставщика должно отображаться как одно из значений AdditionalAuthenticationProvider.

    Затем используйте Get-AdfsAdditionalAuthenticationRule. В результате выбора политики в пользовательском интерфейсе администратора должны отображаться правила Экстранет и Интранет.

Создание политики проверки подлинности с помощью Windows PowerShell

  1. Сначала включите поставщика в глобальные настройки политики.

    Set-AdfsGlobalAuthenticationPolicy -AdditionalAuthenticationProvider “YourAuthProviderName”`
    

    Note

    Обратите внимание, что значение, предоставленное для параметра AdditionalAuthenticationProvider, соответствует значению, предоставленному для параметра Name в командлете Register-AdfsAuthenticationProvider выше, и свойству Name из выходных данных командлета Get-AdfsAuthenticationProvider.

    Set-AdfsGlobalAuthenticationPolicy –AdditionalAuthenticationProvider “MyMFAAdapter”`
    
  2. Затем настройте глобальные или рассчитанные на доверенную сторону правила для запуска MFA.

    Пример 1. Создание глобального правила для требования MFA для внешних запросов:

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

    Пример 2. Создание правил MFA, чтобы требовать MFA для внешних запросов к конкретной проверяющей стороне. (Note: Individual providers cannot be connected to individual relying parties in AD FS in 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" );'
    

Пройдите аутентификацию с использованием MFA и адаптера

Наконец, выполните приведенные ниже действия, чтобы протестировать адаптер:

  1. Убедитесь, что глобальный первичный метод проверки подлинности AD FS настроен как аутентификация с использованием форм для экстрасети и интрасети, что упрощает процесс проверки подлинности в качестве конкретного пользователя.

    1. In the AD FS snap-in, under Authentication Policies, in the Primary Authentication area, click Edit next to Global Settings.

      1. Or just click the Primary tab from the Multi-factor policy UI.
  2. Ensure Forms Authentication is the only option checked for both the Extranet and the Intranet authentication method. Click OK.

  3. Откройте HTML-страницу, инициированную поставщиком удостоверений (https://<fsname>/adfs/ls/idpinitiatedsignon.htm) и войдите как действующий пользователь AD в тестовой среде.

  4. Введите учетные данные для первичной проверки подлинности.

  5. Вы должны увидеть страницу форм MFA с примерами вопросов для проверки.

    Если настроено несколько адаптеров, вы увидите страницу выбора MFA с вашим пользовательским именем, указанным выше.

    Снимок экрана страницы с формами M F A и примерами контрольных вопросов.

    Снимок экрана страницы выбора MFA.

Теперь у вас есть рабочая реализация интерфейса, и у вас есть знания о том, как работает модель. Вы можете попробовать в качестве дополнительного примера задать точки останова в BeginAuthentication и TryEndAuthentication. Обратите внимание, как BeginAuthentication выполняется при первом входе пользователя в форму MFA, в то время как TryEndAuthentication активируется при каждой отправке формы.

Обновление адаптера для успешной проверки подлинности

Но подождите — ваш пример адаптера никогда не будет успешно аутентифицироваться! Это связано с тем, что в коде ничего не возвращает значение NULL для TryEndAuthentication.

Выполнив описанные выше процедуры, вы создали базовую реализацию адаптера и добавили ее на сервер AD FS. Вы можете получить страницу форм MFA, но вы еще не можете пройти проверку подлинности, так как вы еще не положили правильную логику в реализацию TryEndAuthentication. Итак, давайте добавим это.

Вспомните вашу реализацию 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();
}

Давайте обновим его так, чтобы он не всегда возвращал MyPresentationForm(). Для этого можно создать один простой метод служебной программы в классе:

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

Затем обновите TryEndAuthentication, как показано ниже:

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

Теперь нужно обновить адаптер на тестовом стенде. Сначала необходимо отменить политику AD FS, а затем отменить регистрацию из AD FS и перезапустить AD FS, а затем удалить .dll из GAC, а затем добавить новый .dll в GAC, а затем зарегистрировать его в AD FS, перезапустить AD FS и перенастроить политику AD FS.

Развертывание и настройка обновленного адаптера на тестовом компьютере AD FS

Очистка политики AD FS

Снимите все связанные флажки MFA в пользовательском интерфейсе MFA, показанные ниже, и нажмите кнопку "ОК".

четкая политика

Отмена регистрации поставщика (Windows PowerShell)

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

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

Значение, передаваемое для "Name", совпадает с тем же значением "Name", которое вы передали командлету Register-AdfsAuthenticationProvider. Это также свойство "Name", которое выводится с помощью Get-AdfsAuthenticationProvider.

Перед отменой регистрации поставщика необходимо удалить поставщика из AdfsGlobalAuthenticationPolicy (снимите флажки, которые вы проверили в консоли управления AD FS либо с помощью Windows PowerShell.)

После этой операции необходимо перезапустить службу AD FS.

Удалить сборку из GAC

  1. Сначала используйте следующую команду, чтобы найти полное строгое имя записи:C:>.gacutil.exe /l <yourAdapterAssemblyName>

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

  2. Затем используйте следующую команду, чтобы удалить ее из GAC:.gacutil /u “<output from the above command>”

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

Добавление обновленной сборки в GAC

Сначала вставьте обновленный .dll локально. C:>.gacutil.exe /if .MFAAdapter.dll

Просмотр сборки в GAC (командная строка)

C:> .gacutil.exe /l mfaadapter

Регистрация поставщика в 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. Перезапустите службу AD FS.

Создайте политику проверки подлинности с помощью оснастки управления AD FS

  1. Open the AD FS Management snap-in (from the Server Manager Tools menu).

  2. Click Authentication Policies.

  3. Under Multi-Factor Authentication, click the Edit link to the right of Global Settings.

  4. В разделе "Выбор дополнительных методов проверки подлинности" установите флажок "AdminName" вашего поставщика. Click Apply.

  5. To provide a “trigger” to invoke MFA using your adapter, under Locations check both Extranet and Intranet, for example. Click OK.

Пройдите аутентификацию с использованием MFA и адаптера

Наконец, выполните приведенные ниже действия, чтобы протестировать адаптер:

  1. 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. In the AD FS management snap-in, under Authentication Policies, in the Primary Authentication area, click Edit next to Global Settings.

      1. Or just click the Primary tab from the Multi-factor policy UI.
  2. Ensure Forms Authentication is the only option checked for both the Extranet and the Intranet authentication method. Click OK.

  3. Откройте HTML-страницу, инициированную поставщиком удостоверений (https://<fsname>/adfs/ls/idpinitiatedsignon.htm) и войдите как действующий пользователь AD в тестовой среде.

  4. Введите учетные данные для первичной проверки подлинности.

  5. Вы увидите страницу форм MFA с примером текста проверки.

    1. Если у вас настроено более одного адаптера, вы увидите страницу выбора MFA с удобным для пользователя именем.

You should see a successful sign-in when entering adfabric at the MFA authentication page.

Снимок экрана: страница форм MFA с примером текстового задания.

Снимок экрана: страница успешного входа в M F A.

See Also

Other Resources

Дополнительные методы проверки подлинности

Управление рисками с помощью дополнительной многофакторной идентификации для конфиденциальных приложений