web-dev-qa-db-fra.com

SignInManager, qu'est-ce que c'est et comment, quand l'utiliser?

J'explore la classe SignInManager. Mais les informations données sur MSDN sont très inutiles. Il indique uniquement quelles sont les méthodes et les propriétés fournies.

Ce que je cherche, c'est

1) Qu'est-ce que SignInManager? 2) Comment l'utiliser? 3) Et j'ai ma propre base de données qui contient des informations relatives aux informations d'identification (nom d'utilisateur et mots de passe)

Comment utiliser SignInmanager et comment l'utiliser de manière à ce que ma base de données personnalisée soit utilisée pour authentifier les utilisateurs?

J'utilise asp.net MVC 5 et Visual Studio 2015. Dans mon exemple de projet, j'ai un contrôleur de comptes qui contient des méthodes d'action telles que

  public async Task<ActionResult> ExternalLoginCallback(string returnUrl)

Mais je ne sais pas comment l'utiliser, MSDN n'a aucun intérêt à fournir des informations à ce sujet. Tous les liens utiles qui l'expliquent en détail car je n'ai aucune idée de ce qu'est SignInManager ni à quoi il sert.

Merci

42
Alex

Clause de non-responsabilité: le modèle utilisé dans l'identité ASP.NET me laisse perplexe et ce que je dis, c'est ma compréhension des choses, cela peut être inexact (je pourrais aussi énoncer des choses évidentes, alors je m'excuse). De plus, je jouais récemment avec l'identité de Asp.Net Core, ce qui est légèrement différent de ce qui était disponible pour Asp.Net 4. Je peux donc mélanger les choses.

Biscuits

L'identité ASP.NET fonctionne avec deux types de cookies: le cookie d'application et le cookie externe. Le cookie d'application contient l'identité de votre application et est émis par le responsable de la connexion. Le cookie externe contient l'identité du fournisseur d'authentification externe et est émis par le middleware d'authentification (tel que FacebookAuthenticationMiddleware, par exemple). Vous utilisez le Gestionnaire de connexion pour utiliser le cookie externe et émettre à la place un cookie d'application. Si vous n'utilisez pas d'authentification externe, vous ne traitez pas de cookies externes.

Gestionnaire de connexion

Classe déclarée comme ceci:

public class SignInManager<TUser, TKey> : IDisposable 
    where TUser : class, IUser<TKey> 
    where TKey : IEquatable<TKey>

Vous pouvez donc utiliser n'importe quelle classe en tant qu'utilisateur tant qu'elle implémente IUser<TKey> interface. Ou utilisez IdentityUser comme base si vous partez de zéro, qui implémente IUser<string>. Dans le passé, j'ai essayé de créer une implémentation qui utilisait int comme TKey, mais cette tentative a été abandonnée après avoir passé un certain temps à essayer de la faire fonctionner sans voir de progrès.

Connexion par mot de passe

SignInManager.SignInAsync méthode émet immédiatement un cookie d’application pour l’utilisateur spécifié, sans aucune vérification. Ainsi, si vous implémentez une logique d’authentification personnalisée, vous voudrez peut-être l’utiliser (le modèle MVC asp.net par défaut l’utilise après avoir enregistré s'authentifier juste après l'enregistrement).

SignInManager.PasswordSignInAsync étant donné que le nom d'utilisateur et le mot de passe vérifient leur validité et émettent un cookie d'application s'ils sont corrects.

Connexion externe

Au lieu de demander à l'utilisateur de créer spécifiquement un identifiant et un mot de passe pour votre site, vous voudrez peut-être qu'ils utilisent un site Web externe pour s'authentifier et vous transmettre les informations d'authentification avec OAuth.

Asp.Net Identity a la notion de User et Login, où User est ... bien, utilisateur (une personne), et Login est le justificatif avec lequel User s'authentifie. User pourrait avoir plusieurs Logins.

Le flux OAuth tel qu'il apparaît sur le site Web Asp.Net se présente comme suit (basé sur le flux de connexion par défaut généré par le modèle VS):

  1. Vous configurez des fournisseurs d’authentification externes (middleware d’authentification) que vous êtes prêt à accepter (cela implique probablement de vous inscrire sur un site Web externe. Par exemple, pour utiliser l’authentification Facebook, vous devez créer une application Facebook, vous devez y définir une URL de renvoi. votre site Web et configurez FacebookAuthenticationMiddleware avec l’ID et le secret de l’application fournis par Facebook).
  2. Vous présentez à un utilisateur non authentifié un choix de fournisseurs externes que vous prenez en charge.
  3. L'utilisateur choisit un fournisseur, le choix est envoyé à votre application Web Asp.Net.
  4. L'application Web émet un ChallengeResult contenant le nom du fournisseur à utiliser (cela se produit généralement dans AccountController.ExternalLogin), l'URL de retour est défini pour appeler AccountController.ExternalLoginCallback et l’URL de retour réelle que l’utilisateur devrait se retrouver est enregistrée pour plus tard.
  5. Le middleware approprié attrape l'objet ChallengeResult et le convertit en réponse de redirection HTTP qui oblige le navigateur de l'utilisateur à se rendre sur un site Web tiers qui demande à l'utilisateur ses informations d'identification.
  6. La troisième partie du site Web, une fois l'authentification réussie, redirige l'utilisateur vers votre site Web vers l'URL spécifique créée par le middleware d'authentification (pour Facebook, c'est /signin-facebook IIRC).
  7. Le middleware d’authentification intercepte cet appel, valide les données transmises par le site Web tiers et, si tout est en ordre émet le cookie externe, et vous redirige vers ce qui a été défini comme URL de retour à l’étape 4 (qui devrait être AccountController.ExternalLoginCallback).
  8. Dans AccountController.ExternalLoginCallback vous êtes censé utiliser le cookie externe et émettre un cookie d'application. C'est ce que SignInManager.ExternalSignInAsync fait: compte tenu des informations de connexion, il essaie de trouver un utilisateur avec ce Login. S'il trouve, il émet un cookie d'application; Si ce n'est pas le cas, il vous en informera et vous devriez faire ce que vous pensez être juste lorsque vous recevez unknown Login (en général, vous créez un nouvel utilisateur à ce stade. L'implémentation par défaut du modèle VS demande des informations supplémentaires à ce stade. et crée l'utilisateur dans AccountController.ExternalLoginConfirmation). Une fois cet utilisateur redirigé vers l'URL de retour réelle "enregistrée pour plus tard" à l'étape 4.

Stockage personnalisé

Jusqu'à présent, je n'ai pas réussi à créer de stockage personnalisé pour Asp.Net Identity. Cela implique généralement d'implémenter votre propre classe de gestionnaire d'utilisateurs en descendant le UserManager<TUser, TKey> et la classe de stockage implémentant un groupe d’interfaces comme IUserStore<TUser, TKey>, IUserRoleStore<TUser, TKey>, etc.

63
n0rd