Identity IdentityUser PasswordHash何时更新?

时间:2015-05-15 19:16:50

标签: dapper claims-based-identity intuit password-hash

我问这个的原因是因为我正在尝试创建一个MVC app / WebApi服务,使用ExternalLogin Credentials,特别是Intuit外部凭据,并允许登录过程设置Web应用程序的当前标识,通过它的3脚OAuth流程登录到Intuit。我这样做是以Dapper作为后端,而不是EntityFramework。

如果您创建ASP.Net Web应用程序Web API的默认新项目,它将创建一个AccountController并包含名为GetInfo的帐户管理调用。在该函数中,它在设置本地登录提供程序信息之前检查PasswordHash(PasswordHash是IdentityUser的属性):

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

因此,显然,管理PasswordHash的逻辑已在其他地方得到解决。那可能是哪里?我猜,在使用EntityFramework的典型设置中,这是在IdentityUser类的内容中处理的,甚至是UserManager类(UserStore?)。我在源代码中找不到它。

在我与Dapper的实现中,模仿Microsoft.AspNet.Identity.EntityFramework中发生的事情;

  1. PasswordHash的计算,设置和验证应该在哪里发生?
  2. 什么时候应该设置属性?
  3. 或者 - 我不担心这个,因为一些神秘的黑操作进程为对象设置它?

1 个答案:

答案 0 :(得分:1)

未设置密码,请在使用外部提供商登录后检查数据库。

会发生什么:

  1. 用户想要登录
  2. 用户点击按钮登录Google / Facebook
  3. Google / Facebook在登录后会发回外部令牌以及其他一些信息。
  4. 此令牌包含有关用户的信息,您的MVC应用程序将使用该信息对用户进行身份验证。 (用户声明,使用cookie)
  5. 如果帐户已存在,您的MVC应用程序将在数据库中进行检查。 6如果它不存在,则会提示用户填写将存储在您的数据库中的电子邮件地址(不必与google / facebook电子邮件相同的电子邮件)。
  6. 所有魔法发生的过程都在Owin.Security

    之内

    身份验证过程在ExternalLogin,ExternalLoginCallback方法中。这是默认的MVC模板

       // 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 });
            }
        }