Quand Identity IdentityUser PasswordHash est-il mis à jour?

claims-based-identity dapper intuit password-hash

Question

La raison pour laquelle je pose cette question est que j'essaie de créer un service app / WebApi MVC, avec des informations d'identification ExternalLogin, en particulier des informations d'identification externes Intuit, et de permettre au processus de connexion de définir l'identité actuelle de l'application Web. via son processus OAuth à 3 pattes. Je le fais avec Dapper comme backend plutôt qu'EntityFramework.

Si vous créez un nouveau projet par défaut d'une application Web ASP.Net pour Web API, il crée un AccountController et contient un appel de gestion de compte nommé GetInfo. Dans cette fonction, il vérifie PasswordHash, avant de définir les informations de fournisseur de connexion local (PasswordHash est une propriété de IdentityUser):

        if (user.PasswordHash != null)
        {
            logins.Add(new UserLoginInfoViewModel
            {
                LoginProvider = LocalLoginProvider,
                ProviderKey = user.UserName,
            });
        }

La logique de gestion de PasswordHash est donc déjà prise en compte ailleurs. Où est-ce que ça pourrait être? Je devine, dans une configuration typique avec EntityFramework, cela est géré quelque part dans les entrailles de la classe IdentityUser, ou même la classe UserManager (UserStore?). Je ne trouve pas cela dans le code source.

Dans mon implémentation avec Dapper, simuler ce qui se passe dans Microsoft.AspNet.Identity.EntityFramework;

  1. Où le calcul, la configuration et la vérification de PasswordHash doivent-ils avoir lieu?
  2. Quand la propriété doit-elle être définie?

Ou - est-ce que je ne m'inquiète pas à ce sujet car un processus de black-ops obscur le place pour l'objet?

Réponse populaire

Un mot de passe n'est pas défini, vérifiez votre base de données après vous être connecté avec un fournisseur externe.

Ce qui se produit est:

  1. L'utilisateur veut se connecter
  2. L'utilisateur clique sur le bouton pour se connecter avec Google / Facebook
  3. Google / Facebook renvoie un jeton externe avec d'autres informations, une fois la connexion établie.
  4. Ce jeton contient des informations sur l'utilisateur, que votre application MVC utilisera pour authentifier l'utilisateur. (Réclamations de l'utilisateur, utilise des cookies)
  5. Votre application MVC vérifiera dans la base de données si un compte existe déjà. 6 S'il n'existe pas, l'utilisateur est invité à saisir une adresse e-mail qui sera stockée dans votre base de données (le message ne doit pas nécessairement être identique à celui de Google / e-mail).

Le processus où toute la magie se produit est dans le Owin.Security

Le processus d'authentification se situe dans les méthodes ExternalLogin, ExternalLoginCallback. Qui vient avec le modèle MVC par défaut

   // POST: /Account/ExternalLogin
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult ExternalLogin(string provider, string returnUrl)
    {
        // Request a redirect to the external login provider
        return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
    }

    // GET: /Account/ExternalLoginCallback
    [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
        if (loginInfo == null)
        {
            return RedirectToAction("Login");
        }

        // Sign in the user with this external login provider if the user already has a login
        var user = await UserManager.FindAsync(loginInfo.Login);
        if (user != null)
        {
            await SignInAsync(user, isPersistent: false);
            return RedirectToLocal(returnUrl);
        }
        else
        {
            // If the user does not have an account, then prompt the user to create an account
            ViewBag.ReturnUrl = returnUrl;
            ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
            return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
        }
    }



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi