使用 MVC4 Internet 模板项目复制我的问题的步骤:
- 注册本地会员账号(账号A)
- 登出
- 注册一个openid账号(我用google)(账号B)
- 登出
- 重新登录帐户 A
- 导航到帐户/管理
- 在外部链接部分点击谷歌
发生的情况是帐户 A 已注销而帐户 B 已登录。我希望有一些魔术将帐户 A 链接到帐户 B,或者可能是一个例外。所以看起来我需要做那部分。到目前为止,这是我的代码。它取代了帐户控制器中的 ExternalLoginCallback。
[AllowAnonymous]
public ActionResult ExternalLoginCallback(string returnUrl)
{
AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
if (!result.IsSuccessful)
{
return RedirectToAction("ExternalLoginFailure");
}
// Need to do fancy logic in case of multiple accounts
if (User.Identity.IsAuthenticated)
{
// check for second blocking account
// NOTE : This is not a real method, need a real solution
var second = OAuthWebSecurity.GetUserIdFromProviderUserId(result.ProviderUserId);
if (second != WebSecurity.CurrentUserId)
{
// redirect to failure
// "This Login is used by another account... "
}
如您所见,我坚持使用身份验证结果查找帐户。有没有办法使用提供者用户 ID 来查找帐户?任何帮助或见解都会很好。
Hackish Fix Ive 提出了一个快速而肮脏的修复方法。
public ActionResult ExternalLoginCallback(string returnUrl)
{
AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
if (!result.IsSuccessful)
{
return RedirectToAction("ExternalLoginFailure");
}
// Need to do fancy logic in case of multiple accounts
bool isBindingAction = User.Identity.IsAuthenticated;
if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false))
{
if (isBindingAction)
{
// tell the user that he has 2 accounts
return RedirectToAction("ExternalLoginSwitch", new {provider = result.Provider});
}
return RedirectToLocal(returnUrl);
}