Erstellen einer benutzerdefinierten Authentifizierungsmethode für AD FS in Windows Server
Diese exemplarische Vorgehensweise enthält Anweisungen zum Implementieren einer benutzerdefinierten Authentifizierungsmethode für AD FS in Windows Server 2012 R2. Weitere Informationen finden Sie unter Zusätzliche Authentifizierungsmethoden.
Warnung
Das Beispiel, das Sie hier erstellen können, ist nur für Bildungszwecke vorgesehen. Diese Anweisungen sind für die einfachste, minimalste Implementierung möglich, um die erforderlichen Elemente des Modells verfügbar zu machen. Es gibt keine Authentifizierungs-Back-End-, Fehlerverarbeitungs- oder Konfigurationsdaten.
Einrichten der Dev-Box
In dieser Schritt-für-Schritt-Anleitung wird Visual Studio 2012 verwendet. Das Projekt kann mit jeder Entwicklungsumgebung erstellt werden, die eine .NET-Klasse für Windows erstellen kann. Das Projekt muss auf .NET 4.5 abzielen, da die BeginAuthentication- und TryEndAuthentication- Methoden den Typ System.Security.Claims.Claimverwenden, Teil von .NET Framework, Version 4.5. Für das Projekt ist ein Verweis erforderlich:
Referenz-DLL | Wo sie zu finden ist | Erforderlich für |
---|---|---|
Microsoft.IdentityServer.Web.dll | Die DLL befindet sich in %windir%\ADFS auf einem Windows Server 2012 R2-Server, auf dem AD FS installiert wurde. Diese DLL muss auf den Entwicklungscomputer kopiert werden, und im Projekt muss ein expliziter Verweis erstellt werden. |
Schnittstellentypen, einschließlich IAuthenticationContext, IProofData |
Erstellen Sie den Anbieter
Wählen Sie in Visual Studio 2012 „Datei“ -> „Neu“ -> „Projekt“ aus.
Wählen Sie "Klassenbibliothek" aus, und stellen Sie sicher, dass Sie .NET 4.5 verwenden.
Erstellen Sie eine Kopie von Microsoft.IdentityServer.Web.dll aus %windir%\ADFS auf dem Windows Server 2012 R2-Server, auf dem AD FS installiert wurde, und fügen Sie sie in Ihren Project-Ordner auf Ihrem Entwicklungscomputer ein.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Verweise und dann auf Verweis hinzufügen.
Navigieren Sie zu Ihrer lokalen Kopie von Microsoft.IdentityServer.Web.dll und , und fügen Sie hinzu...
Klicken Sie auf OK, um den neuen Verweis zu bestätigen:
Nun sollte die Umgebung so eingerichtet sein, dass alle Typen, die für den Anbieter erforderlich sind, aufgelöst werden.
Fügen Sie Ihrem Projekt eine neue Klasse hinzu (klicken Sie mit der rechten Maustaste auf Ihr Projekt, Hinzufügen... Klasse...) und geben Sie ihm einen Namen wie MyAdapter, siehe unten:
Ersetzen Sie in der neuen Datei MyAdapter.cs den vorhandenen Code durch Folgendes:
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 } } }
Wir sind noch nicht bereit, mit dem Bau zu beginnen... es gibt noch zwei Schnittstellen, die erledigt werden müssen.
Fügen Sie Ihrem Projekt zwei weitere Klassen hinzu: eine für die Metadaten und die andere für das Präsentationsformular. Sie können diese in derselben Datei wie die obige Klasse hinzufügen.
class MyMetadata : IAuthenticationAdapterMetadata { } class MyPresentationForm : IAdapterPresentationForm { }
Als Nächstes können Sie die erforderlichen Mitglieder für jeden hinzufügen. Zuerst die Metadaten (mit hilfreichen Inlinekommentaren)
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; } } }
Jetzt sollten Sie die F12-Taste drücken (Rechtsklick – Gehe zu Definitionen) auf IAuthenticationAdapter, um die erforderlichen Schnittstellenmitglieder anzuzeigen.
Als Nächstes können Sie eine Implementierung dieser Aktionen ausführen.
Ersetzen Sie den gesamten Inhalt Ihrer Klasse durch Folgendes:
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 } } }
Als Nächstes, die Präsentationsform:
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"; } }
Beachten Sie das „todo“ für das Element Resources.FormPageHtml oben. Sie können dies in Kürze beheben, aber zuerst werden die letzten erforderlichen Rückgabeanweisungen basierend auf den neu implementierten Typen der anfänglichen MyAdapter-Klasse hinzugefügt. Fügen Sie hierzu Ihrer vorhandenen IAuthenticationAdapter-Implementierung Folgendes hinzu:
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(); } }
Jetzt für die Ressourcendatei, die das HTML-Fragment enthält. Erstellen Sie eine neue Textdatei in Ihrem Projektordner mit folgendem Inhalt:
<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>
Wählen Sie dann Projekt -> Komponente hinzufügen und dann „Ressourcendatei“ aus. Geben Sie der Datei den Namen Resources, und klicken Sie auf Hinzufügen:
Wählen Sie dann innerhalb der Datei Resources.resx die Option Ressource hinzufügen... Vorhandene Dateihinzufügen. Navigieren Sie zu der Textdatei (die das html-Fragment enthält), das Sie oben gespeichert haben.
Stellen Sie sicher, dass der GetFormHtml-Code den Namen der neuen Ressource korrekt durch das Präfix der Ressourcendatei (RESX-Datei) auflöst, gefolgt vom Namen der Ressource selbst:
public string GetFormHtml(int lcid) { string htmlTemplate = Resources.MfaFormHtml; //Resxfilename.resourcename return htmlTemplate; }
Sie sollten jetzt in der Lage sein, zu bauen.
Erstellen des Adapters
Der Adapter sollte in eine stark benannte .NET-Assembly integriert werden, die in der GAC in Windows installiert werden kann. Führen Sie die folgenden Schritte aus, um dies in einem Visual Studio-Projekt zu erreichen:
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und klicken Sie dann auf Eigenschaften.
Aktivieren Sie auf der Registerkarte Signieren die Option Assembly signieren und wählen Sie <Neu> unter Schlüsseldatei mit starkem Namen auswählen: aus. Geben Sie einen Namen und ein Kennwort ein und klicken Sie auf OK. Stellen Sie dann sicher, dass Assembly signieren aktiviert und Nur Signierung verzögern deaktiviert ist. Die Seite Signieren für Eigenschaften sollte wie folgt aussehen:
Erstellen Sie dann die Lösung.
Bereitstellen des Adapters auf Ihrem AD FS-Testcomputer
Bevor ein externer Anbieter von AD FS aufgerufen werden kann, muss er im System registriert werden. Adapteranbieter müssen ein Installationsprogramm bereitstellen, das die erforderlichen Installationsaktionen ausführt, einschließlich der Installation im GAC, und das Installationsprogramm muss die Registrierung in AD FS unterstützen. Wenn dies nicht der Fall ist, muss der Administrator die folgenden Windows PowerShell-Schritte ausführen. Diese Schritte können im Labor verwendet werden, um Tests und Debugging zu ermöglichen.
Vorbereiten des AD FS-Testcomputers
Kopieren Sie Dateien, und fügen Sie es dem GAC hinzu.
Stellen Sie sicher, dass Sie über einen Windows Server 2012 R2-Computer oder einen virtuellen Computer verfügen.
Installieren Sie den AD FS-Rollendienst, und konfigurieren Sie eine Farm mit mindestens einem Knoten.
Ausführliche Schritte zum Einrichten eines Verbundservers in einer Lab-Umgebung finden Sie im Windows Server 2012 R2 AD FS-Bereitstellungshandbuch.
Kopieren Sie die Gacutil.exe Tools auf den Server.
Gacutil.exe finden Sie unter %homedrive%Program Dateien (x86)Microsoft SDKsWindowsv8.0AbinNETFX 4.0 Tools auf einem Windows 8-Computer. Sie benötigen die Datei gacutil.exe selbst und die Ordner 1033, en-US sowie die anderen lokalisierten Ressourcenordner unterhalb des Speicherorts NETFX 4.0 Tools.
Kopieren Sie Ihre Anbieterdatei(en) (eine oder mehrere .dll-Dateien mit starkem Namen) in denselben Ordner wie gacutil.exe (der Speicherort dient nur der Bequemlichkeit).
Fügen Sie Ihre .dll Datei(n) dem GAC auf jedem AD FS-Verbundserver in der Farm hinzu:
Beispiel: Verwenden des Befehlszeilentools GACutil.exe zum Hinzufügen einer DLL zum GAC:
C:>.gacutil.exe /if .<yourdllname>.dll
Um den resultierenden Eintrag im GAC anzuzeigen:
C:>.gacutil.exe /l <yourassemblyname>
Registrieren Ihres Anbieters in AD FS
Sobald die oben genannten Voraussetzungen erfüllt sind, öffnen Sie ein Windows PowerShell-Befehlsfenster auf Ihrem Verbundserver, und geben Sie die folgenden Befehle ein (beachten Sie, dass Sie diese Befehle auf dem primären Verbundserverserver ausführen müssen, wenn Sie die Windows-Interne Datenbank verwenden):
Register-AdfsAuthenticationProvider –TypeName YourTypeName –Name “AnyNameYouWish” [–ConfigurationFilePath (optional)]
Dabei ist YourTypeName Ihr starker .NET-Typname: „YourDefaultNamespace.YourIAuthenticationAdapterImplementationClassName, YourAssemblyName, Version=YourAssemblyVersion, Culture=neutral, PublicKeyToken=YourPublicKeyTokenValue, processorArchitecture=MSIL“
Dadurch wird Ihr externer Anbieter in AD FS mit dem Namen registriert, den Sie oben für „AnyNameYouWish“ angegeben haben.
Starten Sie den AD FS-Dienst neu (z. B. mithilfe des Windows Services-Snap-Ins).
Führen Sie den folgenden Befehl aus:
Get-AdfsAuthenticationProvider
.Dadurch wird Ihr Anbieter als einer der Anbieter im System angezeigt.
Beispiel:
$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
Wenn der Geräteregistrierungsdienst in Ihrer AD FS-Umgebung aktiviert ist, führen Sie auch den folgenden PowerShell-Befehl aus:
net start drs
Um den registrierten Anbieter zu überprüfen, verwenden Sie den folgenden PowerShell-Befehl:
Get-AdfsAuthenticationProvider
.Dadurch wird Ihr Anbieter als einer der Anbieter im System angezeigt.
Erstellen der AD FS-Authentifizierungsrichtlinie, die den Adapter aufruft
Erstellen der Authentifizierungsrichtlinie mithilfe des AD FS-Verwaltungs-Snap-Ins
Öffnen Sie das AD FS-Verwaltungs-Snap-In (aus dem Menü "Server-Manager Tools").
Klicken Sie auf Authentifizierungsrichtlinien.
Klicken Sie im mittleren Bereich unter Multi-Faktor-Authentifizierung rechts neben Globale Einstellungen auf den Link Bearbeiten.
Aktivieren Sie unten auf der Seite unter Zusätzliche Authentifizierungsmethoden auswählen das Kontrollkästchen für den AdminName Ihres Anbieters. Klicken Sie auf die Option Anwenden.
Wenn Sie einen Auslöser zum Aufrufen von MFA über Ihren Adapter bereitstellen möchten, aktivieren Sie beispielsweise unter Speicherorte sowohl Extranet als auch Intranet. Klicke auf OK. (Informationen zum Konfigurieren von Triggern pro vertrauender Seite finden Sie unter "Erstellen der Authentifizierungsrichtlinie mit Windows PowerShell" weiter unten.)
Überprüfen Sie die Ergebnisse mithilfe der folgenden Befehle:
Verwenden Sie zuerst
Get-AdfsGlobalAuthenticationPolicy
. Der Anbietername sollte als einer der AdditionalAuthenticationProvider-Werte angezeigt werden.Verwenden Sie dann
Get-AdfsAdditionalAuthenticationRule
. Die Regeln für Extranet und Intranet sollten als Ergebnis der Richtlinienauswahl auf der Benutzeroberfläche für Administrator*innen konfiguriert sein.
Erstellen der Authentifizierungsrichtlinie mit Windows PowerShell
Aktivieren Sie zunächst den Anbieter in der globalen Richtlinie:
Set-AdfsGlobalAuthenticationPolicy -AdditionalAuthenticationProvider “YourAuthProviderName”`
Hinweis
Beachten Sie, dass der für den Parameter AdditionalAuthenticationProvider angegebene Wert dem Wert entspricht, den Sie für den Parameter "Name" im obigen Cmdlet Register-AdfsAuthenticationProvider und der Eigenschaft "Name" aus Get-AdfsAuthenticationProvider Cmdlet-Ausgabe angegeben haben.
Set-AdfsGlobalAuthenticationPolicy –AdditionalAuthenticationProvider “MyMFAAdapter”`
Konfigurieren Sie als Nächstes globale oder für eine spezifische vertrauende Partei geltende Regeln, um MFA auszulösen.
Beispiel 1: Erstellen einer globalen Regel zum Anfordern von MFA für externe Anforderungen:
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" );'
Beispiel 2: So erstellen Sie MFA-Regeln, um MFA für externe Anforderungen an eine bestimmte vertrauende Seite zu erfordern. (Hinweis: Einzelne Anbieter können nicht mit einzelnen vertrauenden Parteien in AD FS in Windows Server 2012 R2 verbunden werden.
$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" );'
Authentifizieren mit MFA mithilfe des Adapters
Führen Sie schließlich die folgenden Schritte aus, um den Adapter zu testen:
Stellen Sie sicher, dass der globale Authentifizierungstyp AD FS als Formularauthentifizierung für Extranet und Intranet konfiguriert ist (dadurch wird die Authentifizierung ihrer Demo als bestimmter Benutzer vereinfacht).
Klicken Sie im AD FS-Snap-In unter Authentifizierungsrichtlinien im Bereich Primäre Authentifizierung neben Globale Einstellungen auf Bearbeiten.
- Oder klicken Sie einfach auf der Benutzeroberfläche für mehrstufige Richtlinien auf die Registerkarte Primär.
Stellen Sie sicher, dass Formularauthentifizierung die einzige Option ist, die sowohl für das Extranet als auch für die Intranetauthentifizierungsmethode aktiviert ist. Klicke auf OK.
Öffnen Sie die vom IDP initiierte Anmelde-HTML-Seite (https://<fsname>/adfs/ls/idpinitiatedsignon.htm), und melden Sie sich in Ihrer Testumgebung als gültiger AD-Benutzer an.
Geben Sie Anmeldeinformationen für die primäre Authentifizierung ein.
Die Seite „MFA-Formulare“ sollte mit Beispielabfragen angezeigt werden.
Wenn Sie mehrere Adapter konfiguriert haben, wird die MFA-Auswahlseite mit Ihrem Anzeigenamen von oben angezeigt.
authentifizieren
Sie verfügen jetzt über eine funktionierende Implementierung der Schnittstelle, und Sie verfügen über das Wissen darüber, wie das Modell funktioniert. Sie können als zusätzliches Beispiel versuchen, Haltepunkte in der BeginAuthentication und der TryEndAuthentication festzulegen. Beachten Sie, wie BeginAuthentication ausgeführt wird, wenn der Benutzer zuerst das MFA-Formular eingibt, während TryEndAuthentication bei jedem Absenden des Formulars ausgelöst wird.
Aktualisieren des Adapters für die erfolgreiche Authentifizierung
Warten Sie aber – Ihr Beispieladapter wird nie erfolgreich authentifiziert! Dies liegt daran, dass nichts im Code null für TryEndAuthentication zurückgibt.
Durch Ausführen der oben genannten Verfahren haben Sie eine grundlegende Adapterimplementierung erstellt und einem AD FS-Server hinzugefügt. Sie können die MFA-Formularseite abrufen, aber sie können noch nicht authentifiziert werden, da Sie die richtige Logik noch nicht in Ihre TryEndAuthentication-Implementierung gesetzt haben. Fügen wir das also hinzu.
Rufen Sie Ihre TryEndAuthentication-Implementierung zurück:
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();
}
Aktualisieren wir es so, dass es nicht immer MyPresentationForm() zurückgibt. Hierfür können Sie eine einfache Hilfsmethode in Ihrer Klasse erstellen:
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;
}
}
Aktualisieren Sie dann TryEndAuthentication wie folgt:
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();
}
}
Jetzt müssen Sie den Adapter im Testfeld aktualisieren. Sie müssen zuerst die AD FS-Richtlinie rückgängig machen, dann die Registrierung von AD FS aufheben und AD FS neu starten, dann die .dll aus dem GAC entfernen und dann die neue .dll zum GAC hinzufügen und dann in AD FS registrieren, AD FS neu starten und AD FS-Richtlinie neu konfigurieren.
Bereitstellen und Konfigurieren des aktualisierten Adapters auf Ihrem AD FS-Testcomputer
AD FS-Richtlinie löschen
Deaktivieren Sie alle MFA-bezogenen Kontrollkästchen in der MFA-Benutzeroberfläche, die unten angezeigt wird, und klicken Sie dann auf "OK".
Registrierung des Anbieters aufheben (Windows PowerShell)
PS C:> Unregister-AdfsAuthenticationProvider –Name “YourAuthProviderName”
Beispiel:PS C:> Unregister-AdfsAuthenticationProvider –Name “MyMFAAdapter”
Der Wert, den Sie für "Name" übergeben, ist derselbe Wert wie "Name", den Sie für das Cmdlet Register-AdfsAuthenticationProvider angegeben haben. Es ist auch die Eigenschaft "Name", die von "Get-AdfsAuthenticationProvider" ausgegeben wird.
Bevor Sie die Registrierung eines Anbieters aufheben, müssen Sie den Anbieter aus der AdfsGlobalAuthenticationPolicy entfernen (entweder durch Deaktivieren der Kontrollkästchen, die Sie im AD FS-Verwaltungs-Snap-In oder mithilfe von Windows PowerShell eingecheckt haben.)
Der AD FS-Dienst muss nach diesem Vorgang neu gestartet werden.
Entfernen der Assembly aus GAC
Verwenden Sie zunächst den folgenden Befehl, um den vollqualifizierten starken Namen des Eintrags zu finden:
C:>.gacutil.exe /l <yourAdapterAssemblyName>
Beispiel:
C:>.gacutil.exe /l mfaadapter
Verwenden Sie dann den folgenden Befehl, um ihn aus dem GAC zu entfernen:
.gacutil /u “<output from the above command>”
Beispiel:
C:>.gacutil /u “mfaadapter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e675eb33c62805a0, processorArchitecture=MSIL”
Hinzufügen der aktualisierten Assembly zum GAC
Stellen Sie sicher, dass Sie die aktualisierte .dll zuerst lokal einfügen. C:>.gacutil.exe /if .MFAAdapter.dll
Anzeigen der Assembly im GAC (Befehlszeile)
C:> .gacutil.exe /l mfaadapter
Registrieren Ihres Anbieters in AD FS
PS C:>$typeName = "MFAadapter.MyAdapter, MFAadapter, Version=1.0.0.1, Culture=neutral, PublicKeyToken=e675eb33c62805a0, processorArchitecture=MSIL”
PS C:>Register-AdfsAuthenticationProvider -TypeName $typeName -Name “MyMFAAdapter1”
Starten Sie den AD FS-Dienst neu.
Erstellen der Authentifizierungsrichtlinie mithilfe des AD FS-Verwaltungs-Snap-Ins
Öffnen Sie das AD FS-Verwaltungs-Snap-In (aus dem Menü "Server-Manager Tools").
Klicken Sie auf Authentifizierungsrichtlinien.
Klicken Sie unter Multi-Faktor-Authentifizierung rechts neben Globale Einstellungen auf den Link Bearbeiten.
Aktivieren Sie unter "Zusätzliche Authentifizierungsmethoden auswählen"das Kontrollkästchen für den AdminName Ihres Anbieters. Klicken Sie auf die Option Anwenden.
Wenn Sie einen Auslöser zum Aufrufen von MFA über Ihren Adapter bereitstellen möchten, aktivieren Sie beispielsweise unter „Speicherorte“ sowohl Extranet als auch Intranet. Klicke auf OK.
Authentifizieren mit MFA mithilfe des Adapters
Führen Sie schließlich die folgenden Schritte aus, um den Adapter zu testen:
Stellen Sie sicher, dass der globale Authentifizierungstyp AD FS als Formularauthentifizierung für Extranet und Intranet konfiguriert ist (dies erleichtert die Authentifizierung als bestimmter Benutzer).
Klicken Sie im AD FS-Verwaltungs-Snap-In unter Authentifizierungsrichtlinien im Bereich Primäre Authentifizierung neben Globale Einstellungen auf Bearbeiten.
- Oder klicken Sie einfach auf der Benutzeroberfläche für mehrstufige Richtlinien auf die Registerkarte Primär.
Stellen Sie sicher, dass Formularauthentifizierung die einzige Option ist, die sowohl für die Extranet- als auch für die Intranet--Authentifizierungsmethode aktiviert ist. Klicke auf OK.
Öffnen Sie die vom IDP initiierte Anmelde-HTML-Seite (https://<fsname>/adfs/ls/idpinitiatedsignon.htm), und melden Sie sich in Ihrer Testumgebung als gültiger AD-Benutzer an.
Geben Sie die Anmeldeinformationen für die primäre Authentifizierung ein.
Die Seite „MFA-Formulare“ sollte mit einem Beispieltext angezeigt werden.
- Wenn Sie mehrere Adapter konfiguriert haben, wird die MFA-Auswahlseite mit Ihrem Anzeigenamen angezeigt.
Beim Eingeben von adfabric auf der MFA-Authentifizierungsseite sollte eine erfolgreiche Anmeldung erfolgen.
Siehe auch
Weitere Ressourcen
zusätzliche Authentifizierungsmethoden
Verwalten von Risiken mit zusätzlicher mehrstufiger Authentifizierung für vertrauliche Anwendungen