TL; DR
IdentityServer = services de chiffrement et de validation de jetons via OAuth 2.0 / OpenId-Connect
Identité ASP.NET = stratégie actuelle de gestion des identités dans ASP.NET
Comment puis-je m'authentifier de la même manière que dans les versions précédentes de .Net, l'ancienne méthode fonctionne-t-elle toujours ou existe-t-il une version plus récente.
Je ne vois aucune raison pour laquelle vous ne pourriez pas atteindre l'ancienne méthode dans ASP.NET Core, mais en général, cette stratégie a été remplacée par ASP.NET Identity et ASP.NET Identity est bien vivante dans ASP.NET Core.
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity
ASP.NET Identity utilise un magasin de stockage comme SQL Server pour contenir des informations utilisateur telles que le nom d'utilisateur, le mot de passe (haché), le courrier électronique, le téléphone et peut facilement être étendu pour contenir FirstName, LastName ou autre. Il n'y a donc vraiment aucune raison de crypter les informations utilisateur dans un cookie et de les transmettre d'un client à l'autre. Il prend en charge des notions telles que les revendications des utilisateurs, les jetons d'utilisateurs, les rôles d'utilisateurs et les connexions externes. Voici les entités dans ASP.NET Identity:
- Utilisateurs AspNet
- AspNetUserRoles
- AspNetUserClaims
- AspNetUserLogins (pour lier des fournisseurs d'identité externes, comme Google, AAD)
- AspNetUserTokens (pour stocker des éléments tels que access_tokens et refresh_tokens amassés par l'utilisateur)
Quels sont les avantages et les inconvénients de l'utilisation de vos propres versets de serveur de jetons pour créer votre propre principe personnalisé?
Un serveur de jetons serait un système qui génère une structure de données simple contenant des informations d'autorisation et / ou d'authentification. L'autorisation prend généralement le for d'un jeton nommé access_token . Ce serait les "clés de la maison", pour ainsi dire, vous permettant de passer la porte et d'entrer dans la résidence d'une ressource protégée, généralement une API Web. Pour l'authentification, le id_token
contient un identifiant unique pour un utilisateur / une personne. Bien qu'il soit courant de mettre un tel identifiant dans le access_token, il existe désormais un protocole dédié pour cela: OpenID-Connect .
La raison d'avoir votre propre service de jetons de sécurité (STS) serait de protéger vos actifs d'information, via la cryptographie, et de contrôler quels clients (applications) peuvent accéder à ces ressources. De plus, les normes de contrôle d'identité existent désormais dans les spécifications OpenID-Connect. IdentityServer est un exemple de serveur d'autorisation OAuth 2.0 combiné à un serveur d'authentification OpenID-Connect.
Mais rien de tout cela n'est nécessaire si vous voulez juste une table utilisateur dans votre application. Vous n'avez pas besoin d'un serveur de jetons, utilisez simplement ASP.NET Identity. L'identité ASP.NET mappe votre utilisateur à un objet ClaimsIdentity sur le serveur - pas besoin d'une classe IPrincipal personnalisée.
Lorsque vous utilisez une solution basée sur le cloud ou un serveur de jetons séparé, comment intégriez-vous cela à votre application actuelle, aurais-je toujours besoin d'une table d'utilisateurs dans mon application, comment associeriez-vous les deux?
Consultez ces tutoriels pour intégrer des solutions d'identité distinctes avec une application:
https://identityserver4.readthedocs.io/en/latest/quickstarts/0_overview.html
https://auth0.com/docs/quickstart/webapp/aspnet-core
Au minimum, vous auriez besoin d'une table à deux colonnes mappant le nom d'utilisateur à l'identifiant d'utilisateur du fournisseur externe. C'est ce que fait la table AspNetUserLogins dans ASP.NET Identity. Les lignes de cette table dépendent cependant du fait qu'il s'agit d'un enregistrement utilisateur dans AspNetUsers.
ASP.NET Identity prend en charge les fournisseurs externes tels que Google, Microsoft, Facebook, tout fournisseur OpenID-Connect, Azure AD sont déjà là. (Google et Microsoft ont déjà implémenté le protocole OpenID-Connect, vous n'avez donc pas non plus besoin de leurs packages d'intégration personnalisés, comme celui-ci , par exemple). En outre, ADFS n'est pas encore disponible sur ASP.NET Core Identity.
Consultez ce document pour démarrer avec les fournisseurs externes dans ASP.NET Identity:
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/
Étant donné qu'il existe tellement de solutions différentes, comment puis-je créer une application d'entreprise, pour permettre la connexion via Gmail / Facebook tout en étant capable de s'étendre à d'autres SSO
Comme expliqué ci-dessus, ASP.NET Identity le fait déjà. Il est assez facile de créer un tableau «Fournisseurs externes» et les données pilotent votre processus de connexion externe. Donc, quand un nouveau "SSO" arrive, ajoutez simplement une nouvelle ligne avec les propriétés comme l'url du fournisseur, l'ID client et le secret qu'il vous donne. ASP.NET Identity a déjà l'interface utilisateur intégrée dans les modèles Visual Studio, mais consultez Connexion sociale pour des boutons plus cool.
Sommaire
Si vous avez juste besoin d'une table d'utilisateurs avec des capacités de connexion par mot de passe et un profil utilisateur, alors ASP.NET Identity est parfait. Pas besoin d'impliquer des autorités extérieures. Mais, si de nombreuses applications ont besoin d'accéder à de nombreuses API, une autorité indépendante pour sécuriser et valider les jetons d'identité et d'accès est logique. IdentityServer est un bon choix , ou voir openiddict-core ou Auth0 pour une solution cloud.
Je m'excuse, c'est que cela n'atteint pas la cible ou si c'est trop introductif. N'hésitez pas à interagir pour accéder à la cible que vous recherchez.
Addendum: Authentification des cookies
Pour effectuer une authentification simple avec des cookies, procédez comme suit. Mais, à ma connaissance, un principal de revendications personnalisé n'est pas pris en charge. Pour obtenir le même effet, utilisez la liste des revendications de l' ClaimPrincipal
objet.
Créez une nouvelle application Web ASP.NET Core 1.1 dans Visual Studio 2015/2017 en choisissant «Aucune authentification» dans la boîte de dialogue. Ensuite, ajoutez le package:
Microsoft.AspNetCore.Authentication.Cookies
Sous la Configure
méthode en Startup.cs
place ceci (avant app.UseMvc
):
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = "MyCookieMiddlewareInstance",
LoginPath = new PathString("/Controller/Login/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
Ensuite, créez une interface utilisateur de connexion et publiez le formulaire html dans une méthode d'action comme celle-ci:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(String username, String password, String returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
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();
}
L'objet HttpContext.User doit avoir vos revendications personnalisées et sont facilement récupérables dans la collection List de ClaimPrincipal.
J'espère que cela suffira, car une solution / projet complet semble un peu trop pour un article StackOverflow.