我问这个的原因是因为我正在尝试创建一个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中发生的事情;
或者 - 我不担心这个,因为一些神秘的黑操作进程为对象设置它?
答案 0 :(得分:1)
未设置密码,请在使用外部提供商登录后检查数据库。
会发生什么:
所有魔法发生的过程都在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 });
}
}