TL; DR
IdentityServer = Token-Verschlüsselungs- und Validierungsdienste über OAuth 2.0 / OpenId-Connect
ASP.NET Identity = aktuelle Identity Management-Strategie in ASP.NET
Wie kann ich mich ähnlich wie in früheren Versionen von .Net authentifizieren? Funktioniert die alte Methode immer noch oder gibt es eine neuere Version?
Ich sehe keinen Grund, warum Sie den alten Weg in ASP.NET Core nicht erreichen konnten, aber im Allgemeinen wurde diese Strategie durch ASP.NET Identity ersetzt, und ASP.NET Identity ist in ASP.NET Core lebendig und gut.
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity
ASP.NET Identity verwendet einen Sicherungsspeicher wie SQL Server, um Benutzerinformationen wie Benutzername, Kennwort (Hash), E-Mail, Telefon zu speichern, und kann problemlos erweitert werden, um Vorname, Nachname oder was auch immer zu speichern. Es gibt also wirklich keinen Grund, Benutzerinformationen in ein Cookie zu verschlüsseln und vom Client zum Server hin und her zu übertragen. Es unterstützt Begriffe wie Benutzeransprüche, Benutzertoken, Benutzerrollen und externe Anmeldungen. Hier sind die Entitäten in ASP.NET Identity:
- AspNetUsers
- AspNetUserRoles
- AspNetUserClaims
- AspNetUserLogins (zum Verknüpfen externer Identitätsanbieter wie Google, AAD)
- AspNetUserTokens (zum Speichern von Dingen wie access_tokens und refresh_tokens, die vom Benutzer angehäuft wurden)
Was sind die Vor- und Nachteile der Verwendung Ihrer eigenen Token-Server-Verse, um Ihr eigenes benutzerdefiniertes Prinzip zu erstellen?
Ein Tokenserver wäre ein System, das eine einfache Datenstruktur generiert, die Autorisierungs- und / oder Authentifizierungsinformationen enthält. Für die Autorisierung wird normalerweise ein Token mit dem Namen access_token verwendet . Dies wären sozusagen die "Schlüssel zum Haus", die Sie durch die Tür in die Residenz einer geschützten Ressource, normalerweise einer Web-API, führen. Für die Authentifizierung id_token
enthält die eine eindeutige Kennung für einen Benutzer / eine Person. Während es üblich ist, eine solche Kennung in das access_token einzufügen, gibt es jetzt ein dediziertes Protokoll dafür: OpenID-Connect .
Der Grund für Ihren eigenen Security Token Service (STS) besteht darin, Ihre Informationsressourcen über Kryptografie zu schützen und zu steuern, welche Clients (Anwendungen) auf diese Ressourcen zugreifen können. Darüber hinaus sind die Standards für Identitätskontrollen jetzt in den OpenID-Connect-Spezifikationen enthalten. IdentityServer ist ein Beispiel für einen OAuth 2.0-Autorisierungsserver in Kombination mit einem OpenID-Connect-Authentifizierungsserver.
Dies ist jedoch nicht erforderlich, wenn Sie nur eine Benutzertabelle in Ihrer Anwendung haben möchten. Sie benötigen keinen Tokenserver - verwenden Sie einfach ASP.NET Identity. ASP.NET Identity ordnet Ihren Benutzer einem ClaimsIdentity- Objekt auf dem Server zu, ohne dass eine benutzerdefinierte IPrincipal-Klasse erforderlich ist.
Wenn Sie eine Cloud-basierte Lösung oder einen separaten Token-Server verwenden, wie würden Sie dies in Ihre aktuelle Anwendung integrieren? Würde ich weiterhin eine Benutzertabelle in meiner Anwendung benötigen, wie würden Sie die beiden verknüpfen?
In diesen Tutorials finden Sie Informationen zur Integration separater Identitätslösungen in eine Anwendung:
https://identityserver4.readthedocs.io/en/latest/quickstarts/0_overview.html
https://auth0.com/docs/quickstart/webapp/aspnet-core
Sie benötigen mindestens eine zweispaltige Tabelle, in der der Benutzername der Benutzerkennung des externen Anbieters zugeordnet wird. Dies ist, was die AspNetUserLogins-Tabelle in ASP.NET Identity tut. Die Zeilen in dieser Tabelle hängen jedoch davon ab, ob es sich um einen Benutzerdatensatz in AspNetUsers handelt.
ASP.NET Identity unterstützt externe Anbieter wie Google, Microsoft, Facebook, alle OpenID-Connect-Anbieter und Azure AD. (Google und Microsoft haben das OpenID-Connect-Protokoll bereits implementiert, sodass Sie auch keine benutzerdefinierten Integrationspakete wie dieses benötigen .) Außerdem ist ADFS unter ASP.NET Core Identity noch nicht verfügbar.
In diesem Dokument finden Sie Informationen zu externen Anbietern in ASP.NET Identity:
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/
Da es so viele verschiedene Lösungen gibt, kann ich eine Unternehmensanwendung erstellen, um die Anmeldung über Google Mail / Facebook zu ermöglichen und gleichzeitig auf andere SSOs zu erweitern
Wie oben erläutert, führt ASP.NET Identity dies bereits aus. Es ist ziemlich einfach, eine Tabelle "Externe Anbieter" zu erstellen, und Daten steuern Ihren externen Anmeldevorgang. Wenn also ein neues "SSO" hinzukommt, fügen Sie einfach eine neue Zeile mit den Eigenschaften wie der URL des Anbieters, der Client-ID und dem Geheimnis hinzu, das sie Ihnen geben. In ASP.NET Identity ist die Benutzeroberfläche bereits in Visual Studio-Vorlagen integriert. Coolere Schaltflächen finden Sie unter Soziale Anmeldung .
Zusammenfassung
Wenn Sie nur eine Benutzertabelle mit Kennwortanmeldefunktionen und einem Benutzerprofil benötigen, ist ASP.NET Identity perfekt. Keine Notwendigkeit, externe Behörden einzubeziehen. Wenn jedoch viele Anwendungen auf viele APIs zugreifen müssen, ist eine unabhängige Behörde zum Sichern und Validieren von Identitäts- und Zugriffstoken sinnvoll. IdentityServer passt gut zu Openiddict-Core oder Auth0 für eine Cloud-Lösung.
Ich entschuldige mich dafür, dass dies nicht ins Schwarze trifft oder zu einleitend ist. Bitte zögern Sie nicht zu interagieren, um zu dem Ziel zu gelangen, das Sie suchen.
Nachtrag: Cookie-Authentifizierung
Führen Sie die folgenden Schritte aus, um die Bare-Bones-Authentifizierung mit Cookies durchzuführen. Meines Wissens wird ein benutzerdefinierter Anspruchsprinzipal jedoch nicht unterstützt. Verwenden Sie die Anspruchsliste des ClaimPrincipal
Objekts, um den gleichen Effekt zu erzielen .
Erstellen Sie eine neue ASP.NET Core 1.1-Webanwendung in Visual Studio 2015/2017, indem Sie im Dialogfeld "Keine Authentifizierung" auswählen. Dann Paket hinzufügen:
Microsoft.AspNetCore.Authentication.Cookies
Unter der vorhandenen Configure
Methode Startup.cs
(vorher app.UseMvc
):
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = "MyCookieMiddlewareInstance",
LoginPath = new PathString("/Controller/Login/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
Erstellen Sie dann eine Anmelde-Benutzeroberfläche und senden Sie das HTML-Formular an eine Aktionsmethode wie die folgende:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(String username, String password, String returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
// check user's password hash in database
// retrieve user info
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, username),
new Claim("FirstName", "Alice"),
new Claim("LastName", "Smith")
};
var identity = new ClaimsIdentity(claims, "Password");
var principal = new ClaimsPrincipal(identity);
await HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal);
return RedirectToLocal(returnUrl);
}
ModelState.AddModelError(String.Empty, "Invalid login attempt.");
return View();
}
Das HttpContext.User-Objekt sollte Ihre benutzerdefinierten Ansprüche haben und die List-Auflistung des ClaimPrincipal leicht abrufbar sein.
Ich hoffe, dies reicht aus, da eine vollständige Lösung / ein Projekt für einen StackOverflow-Beitrag ein bisschen viel zu sein scheint.