1

使用 MVC4 Internet 模板项目复制我的问题的步骤:

  1. 注册本地会员账号(账号A)
  2. 登出
  3. 注册一个openid账号(我用google)(账号B)
  4. 登出
  5. 重新登录帐户 A
  6. 导航到帐户/管理
  7. 在外部链接部分点击谷歌

发生的情况是帐户 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);
        }
4

1 回答 1

0

我想如果您只是将 Login 呼叫替换为以下呼叫:

public static string GetUserName(string providerName, string providerUserId);

并检查这个provider/providerUserId是否存在用户名,这样会更好。调用 Login 的唯一问题是我相信这仍然会将表单身份验证票设置为错误的用户。

于 2013-05-09T17:02:45.187 回答