Asp.net-Mvc

將新的 Google 或 Facebook 登錄名與現有帳戶相關聯

  • February 14, 2017

我剛剛按照本文中的說明將 Google 作為登錄提供程序添加到我的 MVC 5 應用程序中。一切似乎都正常,但是當我通過 Google 登錄時,它希望我將 Google 提供的電子郵件/使用者名註冊為我的應用程序中的新帳戶。如果我保留電子郵件原樣並點擊“註冊”按鈕,它會告訴我該地址已被佔用,因為我之前已在我的應用程序自己的登錄提供商處註冊。

如何調整 MVC 項目模板生成的預設程式碼以允許我將 Google 登錄名與現有本地帳戶相關聯?

PS 我對 Facebook 也有同樣的問題。

我認為 Identity 是故意處理它的,因為沒有真正的方法可以僅通過來自第三方的電子郵件來驗證使用者的身份。雖然風險可能相對較低,但有人可能會使用不屬於他們的電子郵件地址在 Facebook 等第三方創建帳戶,然後使用該第三方登錄在另一個網站上冒充帳戶附在同一封電子郵件中。

因此,Identity 僅允許您在登錄時使用外部登錄創建一個新帳戶,而不是附加到現有帳戶。但是,一旦使用者通過其他方式進行了身份驗證,就會提供方法來關聯其他登錄。

如果您不擔心與僅假設電子郵件匹配的是同一個人相關的相對溫和的安全風險,那麼您只需修改ExternalLoginCallbackinAccountController.cs以嘗試通過電子郵件查找使用者:

var user = await UserManager.FindByEmailAsync(loginInfo.Email);

然後讓他們登錄:

await SignInManager.SignInAsync(user);

我完全贊同@Chris Pratt 提出的觀點但是我不確定所使用的程式碼是否足以滿足 OP 的要求。

在 ExternalLoginCallback 內的預設塊中添加此程式碼應該可以完成這項工作

ApplicationUser user = await UserManager.FindByNameAsync(loginInfo.Email);
if (user != null)
{
   var addLoginResult = await UserManager.AddLoginAsync(user.Id, loginInfo.Login);
   if (addLoginResult.Succeeded)
   {
       await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
       return RedirectToLocal(returnUrl);
   }
}

引用自:https://stackoverflow.com/questions/32680412