2016-07-28 42 views
0

Wir haben eine ASP.NET/MVC-Website, die FormsAuthentication verwendet. Wenn der Benutzer versucht, auf eine Seite zuzugreifen, und kein gültiges FormsAuthentication-Cookie besitzt, leitet IIS ihn normalerweise zur Anmeldeansicht um. Wenn der Benutzer einen HttpPost für den Login-Controller ausführt, ruft unsere Controller-Aktion unseren WebApi-Webservice auf, der den Benutzernamen, das Passwort und die customerid für eine Sql-Server-Datenbank validiert. Wenn die Authentifizierung erfolgreich ist, legt die Controlleraktion ein FormsAuthentication-Cookie fest und leitet zu der Seite um, nach der der Benutzer gefragt hat.Kann sich eine Website bei mehreren ADFS-Servern authentifizieren?

Jetzt macht der Verkauf Geräusche über "Single Sign-On", obwohl ich nicht genau weiß, was sie damit meinen. Von dem, was ich gelesen habe, bedeutet dies in der Microsoft World in der Regel MS Active Directory Federation Services zugreifen.

An dieser Stelle habe ich fast keine Ahnung, wie das funktionieren würde, aber bevor ich zu tief hineingrabe, wäre es möglich, den Authentifizierungscode innerhalb des WebApi Webservice zu setzen, wo wir gegen den Sql Server validieren könnten Datenbank oder gegen den ADFS-Server, der für den angegebenen Kunden geeignet ist?

Unser Problem ist, dass wir nicht wissen, wie viele Tausende von Benutzern für einige Hunderte von Kunden arbeiten. Bei vielen Kunden wird ADFS nicht ausgeführt, und diejenigen, die dies tun, haben jeweils einen eigenen ADFS-Server.

Das meiste von dem, was ich in Bezug auf Single Sign-On sehe, scheint die Browserumleitung zum ADFS-Server zu involvieren, dann die Umleitung zurück, und es sieht so aus, als würde man sich überhaupt nicht einloggen, wenn man schon eingeloggt ist Ich denke, das können wir in unserem Fall. Wir können nicht wissen, auf welchen ADFS-Server umgeleitet wird, bis wir die Datenbank gefunden haben.

Also die Frage - ist es möglich, ADFS-Authentifizierung vollständig aus C# -Code in unserem WebAPI-Webdienst zu tun?

(Eine mögliche Komplikation - die Website selbst hat keinen Zugriff auf eine Datenbank. Die einzige Konfigurationseinstellung in der web.config ist die Basis-URL des Webservice. Die Authentifizierung muss im Webservice erfolgen, nicht auf der Website .)

+0

Immer wenn im Zweifel, wie und was SSO ist, denken Sie an einem Google-Ökosystem. Sie greifen auf eine ihrer Apps zu, Sie werden auf eine Anmeldeseite einer noch anderen App weitergeleitet und dann mit den authentifizierten Benutzerinformationen zurückgeleitet. Diese Trennung ermöglicht es dem Identity-Provider, neue Features (wie zwei-Faktor-Authentifizierung) einzuführen, ohne alle Apps zu belästigen, die den Identity-Provider verwenden. Und nicht wahr, SSO in Microsoft World ist nicht an ADFS gebunden. Es ist nur eine der Optionen. –

Antwort

1

Zunächst ist "Single Sign-On" (SSO) nicht auf ADFS beschränkt. Es bedeutet lediglich, dass Sie Ihre Anmeldedaten nur einmal eingeben, und dann "erkennen" alle Systeme, auf die Sie zugreifen, automatisch. Alle nachfolgenden Autorisierungsanfragen sind transparent. Wenn Sie beispielsweise mehrere Websites mit Windows-Authentifizierung in Ihrem Unternehmensintranet (derselben AD-Domäne) verwenden, haben Sie SSO: Sie authentifizieren sich einmalig, wenn Sie sich bei Ihrem Computer anmelden, und dann authentifiziert sich Ihr Webbrowser automatisch bei diesen Websites mit NTLM oder Kerberos. In diesem Fall kein ADFS.

Was ADFS (und allgemein "Federation") erlaubt, ist SSO über Sicherheitsgrenzen hinweg. In der Windows-Welt wird eine Sicherheitszone in der Regel von einer Active Directory-Gesamtstruktur erstellt. Auf alles in dieser Gesamtstruktur kann mit SSO zugegriffen werden, das von der Windows-Authentifizierung bereitgestellt wird. Sobald Sie jedoch diese Zone (SaaS-Anwendung, Website in einem anderen Unternehmensnetzwerk) verlassen, benötigen Sie ein anderes Authentifizierungsprotokoll, um SSO auszuführen, und diese Protokolle werden in ADFS implementiert.

Dann über Ihr spezielles Problem:

  • Was Sie tun können, ist stattdessen FormsAuth zu verwenden, verwenden Sie AdfsAuth. Wenn ein unbekannter Benutzer auf eine Seite zugreift, wird er zur Authentifizierung an ADFS weitergeleitet (unter Verwendung von Browser-Weiterleitungen, die Sie richtig angeben). Um zu wissen, welcher ADFS-Server Ihren Benutzer authentifizieren soll, benötigen Sie eine Möglichkeit, sie zu unterscheiden: eine Liste der IP-Bereiche pro Kunde? eine andere URL pro Kunde?Wenn Sie so etwas nicht haben, dann ist der einzige Weg, ihnen eine Auswahlliste zu zeigen, wie zB: "Ich arbeite für Firma A", "Ich arbeite für Firma B", "Ich arbeite für Firma C", "Ich weiß nicht" Ich arbeite für eines dieser Unternehmen und möchte mich mit FormsAuth authentifizieren. "
  • In diesem Fall muss Ihr WebApi-Webdienst Folgendes tun: Wenn ich weiß, welcher ADFS-Server verwendet wird, leiten Sie den Benutzer dorthin um. Ansonsten authentifizieren Sie den Benutzer wie gewohnt mit der Datenbank.
  • Wenn Sie AdfsAuth für einen Kunden verwenden, ist Ihre Datenbank nutzlos. Sie können alle mit diesem Kunden verknüpften Anmeldeinformationen löschen.

tun ADFS Authentifizierung vollständig aus C# -Code in unserem WebAPI

Nun, es ist möglich, "neu implementieren" ADFS in Ihrem Service, aber Sie werden nicht SSO, wenn Sie das tun. Wenn Sie Föderation verwenden, leiten Sie den Benutzer an den ADFS-Server seiner Firma um. Dieser ADFS-Server befindet sich in der gleichen Domäne wie sein Computer, daher erhält der Benutzer hier SSO. Erneut können Ihre Benutzer SSO nicht erhalten, wenn Sie sie selbst authentifizieren, da sich Ihre Benutzer nicht in derselben Sicherheitszone wie Ihre Site befinden.

1

Bei der Authentifizierung bei mehreren Identitätsanbietern ist es eine typische Umleitung zu your own STS. In diesem Fall müssten Sie also www.yourapp.com auf sts.yourapp.com umleiten, was zu sts.somecustomer.com weiterleitet.

Diagram showing RP-STS

Die spezifische Werkzeuge zu ermöglichen, ein solcher Datenfluss ist die home realm parameter (whr) und der AD FS Powershell API (IDP zur Wartung ermöglichen).

Ihr RP-STS fungiert als Vertrauenspunkt für die App und verwaltet die Auswahl des entsprechenden IDP. Ein RP-STS, viele IP-STS. Jeder IP-STS Ihres Kunden wird in AD FS als Claims-Provider-Trust eingerichtet.

Wie immer hat Vittorio bereits covered the subject besser als ich konnte.

Image showing two IP-STSs authenticating to single RP-STS, with a single RP