Der Grund dafür ist, dass ich versuche, einen MVC-App / WebApi-Service mit ExternalLogin Credentials, speziell Intuit externen Credentials, zu erstellen und dem Login-Prozess zu erlauben, die aktuelle Identität der Web-App festzulegen, sobald sie in Intuit eingeloggt ist über seinen 3-beinigen OAuth-Prozess. Ich mache das mit Dapper als Backend und nicht als EntityFramework.
Wenn Sie ein neues Standardprojekt einer ASP.Net-Webanwendung für Web-API erstellen, erstellt es einen AccountController und enthält einen Kontoverwaltungsaufruf mit Name GetInfo. In dieser Funktion überprüft sie PasswordHash, bevor sie lokale Login-Provider-Informationen setzt (PasswordHash ist eine Eigenschaft von IdentityUser):
if (user.PasswordHash != null)
{
logins.Add(new UserLoginInfoViewModel
{
LoginProvider = LocalLoginProvider,
ProviderKey = user.UserName,
});
}
Offensichtlich ist die Logik zur Verwaltung von PasswordHash bereits anderweitig belegt. Wo könnte das sein? Ich vermute, in einem typischen Setup mit EntityFramework wird dies irgendwo im Inneren der IdentityUser-Klasse oder sogar der UserManager-Klasse (UserStore?) Gehandhabt. Ich kann das im Quellcode nicht finden.
In meiner Implementierung mit Dapper, um nachzuahmen, was in Microsoft.AspNet.Identity.EntityFramework passiert;
Oder - mache ich mir darüber keine Sorgen, da ein arkaner Schwarz-Ops-Prozess es für das Objekt setzt?
Ein Kennwort wird nicht festgelegt. Überprüfen Sie Ihre Datenbank, nachdem Sie sich bei einem externen Anbieter angemeldet haben.
Was passiert ist:
Der Prozess, bei dem all die Magie passiert, ist innerhalb der Owin.Security
Der Prozess der Authentifizierung erfolgt innerhalb der ExternalLogin, ExternalLoginCallback-Methoden. Welche kommt mit der Standard-MVC-Vorlage
// 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 });
}
}