IE 在使用授权时无限循环

本文关键字:无限循环 授权 IE | 更新日期: 2023-09-27 17:56:33

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

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

在 web.config 中。这将在进入我的应用程序时将访问者定向到以下操作结果:

    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和Name。然后,我将它与我的数据库进行匹配,以查看用户是否已存在,如果不存在,则创建一个。我还在自定义角色提供程序中为用户分配了一个角色,但在此之前我遇到了无限循环问题。然后我设置

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

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

好吧,有人可以澄清为什么上面的代码在Chrome/Safari中工作,但在IE中不断循环登录,然后无限循环OAuth?

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

IE 在使用授权时无限循环

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

在此之前,我尝试使用无 cookie 身份验证,但 IE 仍然不想一起玩。

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

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

我知道

这似乎很明显,但你确定 cookie 在 IE 中没有被禁用吗?有一个选项可以在开发人员工具中禁用 Cookie。