【问题标题】:IE looping infinitely when using Authorize使用授权时IE无限循环
【发布时间】:2023-03-12 03:45:01
【问题描述】:

我正在开发一个 Facebook 应用程序,如果访问者通过 Facebook 获得授权,我只想允许访问某些视图。这应该是一个非常简单的任务,我认为是,直到我在 IE 中尝试了它。以下代码在 Chrome 和 Safari 中运行良好。我想使用Forms认证,所以我设置了

<forms loginUrl="~/Account/Login" timeout="2880" />

在 web.config 中。这将在进入我的应用程序时将访问者引导至以下 ActionResult:

    public ActionResult Login(string returnUrl)
    {
        ManagerGame2.Utilities.StaticDataContent.InitStaticData();

        var oAuthClient = new FacebookOAuthClient();
        oAuthClient.AppId = FacebookApplication.Current.AppId;
        oAuthClient.RedirectUri = new Uri(redirectUrl);
        var loginUri = oAuthClient.GetLoginUrl(new Dictionary<string, object> { { "state", returnUrl } });
        return Redirect(loginUri.AbsoluteUri);
    }

然后用户被重定向到 Facebook 页面,并且访问令牌被发送回我的 OAuth ActionResult:

public ActionResult OAuth(string code, string state)
    {
        FacebookOAuthResult oauthResult;
        if (FacebookOAuthResult.TryParse(Request.Url, out oauthResult))
        {
            if (oauthResult.IsSuccess)
            {
                var oAuthClient = new FacebookOAuthClient();
                oAuthClient.AppId = FacebookApplication.Current.AppId;
                oAuthClient.AppSecret = FacebookApplication.Current.AppSecret;
                oAuthClient.RedirectUri = new Uri(redirectUrl);
                dynamic tokenResult = oAuthClient.ExchangeCodeForAccessToken(code);
                string accessToken = tokenResult.access_token;

                DateTime expiresOn = DateTime.MaxValue;

                if (tokenResult.ContainsKey("expires"))
                {
                    DateTimeConvertor.FromUnixTime(tokenResult.expires);
                }

                FacebookClient fbClient = new FacebookClient(accessToken);
                dynamic me = fbClient.Get("me?fields=id,name");
                long facebookID = Convert.ToInt64(me.id);


                Account acc = (from x in db.Account.OfType<Account>() where x.FaceBookID == facebookID select x).FirstOrDefault();
                if (acc == null)
                {
                    acc = CreateAccount(me);
                }
                acc.LatestLogin = DateTime.Now;
                db.Entry(acc).State = EntityState.Modified;
                db.SaveChanges();

                MemoryUserStore.CurrentAccount = acc;

                UserRoleProvider usp = new UserRoleProvider();
                usp.GetRolesForUser(acc.AccountID.ToString());
                FormsAuthentication.SetAuthCookie(acc.AccountID.ToString(), false);

                if (Url.IsLocalUrl(state))
                {
                    return Redirect(state);
                }
                return RedirectToAction("Details", "Account", new { id = acc.AccountID });
            }
        }

        return RedirectToAction("Index", "Account");
    }

我在这里要做的是首先验证我从重定向返回的令牌是否有效。如果是,那么我会提取有关访问者的一些数据,例如 FacebookID 和姓名。然后我将它与我的数据库匹配,以查看用户是否已经存在,如果不存在,我创建一个。我还在我的自定义角色提供程序中为用户分配了一个角色,但在此之前我遇到了无限循环问题。然后我设置

FormsAuthentication.SetAuthCookie(acc.AccountID.ToString(), false);

我认为这是跟踪访问者是否获得授权的核心。据我了解,当访问者尝试调用需要 [Authorize] 的 ActionResult 时,系统将检查此 cookie。

那么,有人可以澄清一下为什么上面的代码在 Chrome/Safari 中运行,但在 IE 中不断循环通过 Login 和 OAuth?

我的应用使用 MVC 3、EF Code First 和 Facebook C# SDK 5.0.25

【问题讨论】:

  • Brian - web.config 中 Facebook Config 部分的设置是什么?我会从那里开始 - 我在几个应用程序上设置了您的设置,并且在所有 IE(7 及更高版本)中都可以正常工作。

标签: c# facebook oauth infinite-loop authorize


【解决方案1】:

好的,所以我发现问题是由 [Authorize] 注释触发的,正如预期的那样。 Facebook SDK 有一个 [CanvasAuthorize] 注释,当我切换到使用它时,IE 工作正常并且不会永远登录。

在此之前,我尝试过使用 cookieless 身份验证,但 IE 仍然不想玩。

据我所知,问题的出现是因为 Facebook 应用程序位于 IFrame 内。据说这用饼干和信任搞砸了。如果有人知道这是为什么,我将不胜感激。

另外,如果有人知道如何通过这个 [CanvasAuthorize] 轻松地使用和维护角色,我会很高兴知道。

【讨论】:

  • 我现在有了真正的答案。事实证明,IE 不信任 iframe 中的 cookie。这是因为P3P平台的一些不好的处理。谁会猜到...无论如何,我通过在 OAuth 方法中添加:Response.AddHeader("P3P", "CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'"); 来修复它,因为这是写入 cookie 的地方。它现在就像一个魅力!
【解决方案2】:

我知道这看起来很明显,但你确定 IE 中没有禁用 cookie 吗?开发者工具中有一个禁用 cookie 的选项。

【讨论】:

  • 是的,这确实非常明显。我也是这么想的。我在 IE 8 中进行测试,cookie 设置是通过自动 cookie 处理设置的。 Internet 区域的隐私设置设置为中等,这会阻止没有紧凑隐私政策的第三方 cookie,或者如果它们保存的信息可用于在没有明确内容的情况下联系我。我认为这不适用于我的 cookie,即使我不知道 AuthCookie 是如何制作的。
  • 这些设置看起来不错,尝试在调用 FormsAuthentication.SetAuthCookie(acc.AccountID.ToString(), true); 的地方将 persist 参数设置为 true;
  • 为了它,我升级到了 IE 9。问题依然存在。
猜你喜欢
  • 1970-01-01
  • 2014-06-12
  • 2013-06-07
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2015-11-14
相关资源
最近更新 更多