C# 使用授权时无限循环

C# 使用授权时无限循环,c#,facebook,oauth,infinite-loop,authorize,C#,Facebook,Oauth,Infinite Loop,Authorize,我正在开发一个Facebook应用程序,我只想在访问者通过Facebook获得授权的情况下允许访问某些视图。这应该是一个相当简单的任务,我一直认为是,直到我在IE中尝试了它。下面的代码在Chrome和Safari中运行良好。我想使用表单身份验证,因此我设置了 <forms loginUrl="~/Account/Login" timeout="2880" /> 我认为这是跟踪访客是否被授权的核心。据我所知,当访问者试图调用需要[Authorize]的ActionResult时,系统

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

<forms loginUrl="~/Account/Login" timeout="2880" />
我认为这是跟踪访客是否被授权的核心。据我所知,当访问者试图调用需要[Authorize]的ActionResult时,系统将检查此cookie

好的,有人能澄清一下为什么上面的代码在Chrome/Safari中工作,但在IE中通过登录和OAuth无限循环吗


我的应用程序使用的是MVC 3、EF代码优先和Facebook C#SDK 5.0.25

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

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

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

在此之前,我曾尝试使用无cookieless身份验证,但IE仍然不想配合

据我所知,问题的出现是因为Facebook应用程序在IFrame中。这可能会把饼干和信任搞砸。如果有人知道这是为什么,我会很高兴听到


另外,如果有人知道如何使用和维护角色,我很乐意知道。

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

在此之前,我曾尝试使用无cookieless身份验证,但IE仍然不想配合

据我所知,问题的出现是因为Facebook应用程序在IFrame中。这可能会把饼干和信任搞砸。如果有人知道这是为什么,我会很高兴听到


另外,如果有人知道如何使用和维护角色,我很乐意知道。

是的,这是非常明显的。我也想到了。Im在IE8中进行测试,cookie设置由自动cookie处理设置。internet zone的隐私设置设置为“中”,这将阻止没有紧凑隐私策略的第三方cookie,或者如果它们保存的信息可以用来在没有明确内容的情况下欺骗我。我认为这不适用于我的Cookie,即使我不知道AuthCookie是如何制作的。这些设置似乎很好,请尝试在调用FormsAuthentication.SetAuthCookie(acc.AccountID.ToString(),true)的地方将persist参数设置为true;为了它,我升级到了IE 9。问题依然存在。是的,这确实非常明显。我也想到了。Im在IE8中进行测试,cookie设置由自动cookie处理设置。internet zone的隐私设置设置为“中”,这将阻止没有紧凑隐私策略的第三方cookie,或者如果它们保存的信息可以用来在没有明确内容的情况下欺骗我。我认为这不适用于我的Cookie,即使我不知道AuthCookie是如何制作的。这些设置似乎很好,请尝试在调用FormsAuthentication.SetAuthCookie(acc.AccountID.ToString(),true)的地方将persist参数设置为true;为了它,我升级到了IE 9。问题依然存在。Brian-Facebook配置部分的web.config中有哪些设置?我从这里开始-我在几个应用程序上都有你的设置,并且在所有IE(7及以上)中都运行良好。Brian-Facebook配置部分的web.config中有哪些设置?我从这里开始——我在几个应用程序上都有你的设置,在所有IE(7及以上)中都运行良好。我现在有了一个真正的答案。原来IE不信任iframes中的cookies。这是因为P3P平台的一些不良处理。谁会想到。。。无论如何,我通过添加:
Response.AddHeader(“P3P”,“CP='IDC-DSP-COR-ADM-DEVi-TAIi PSA-PSD-IVAi-IVDi-CONi-HIS-OUR-IND-CNT'”)来修复它到OAuth方法,因为这是写入cookie的地方。现在它就像一个符咒!我现在有了一个真正的答案。原来IE不信任iframes中的cookies。这是因为P3P平台的一些不良处理。谁会想到。。。无论如何,我通过添加:
Response.AddHeader(“P3P”,“CP='IDC-DSP-COR-ADM-DEVi-TAIi PSA-PSD-IVAi-IVDi-CONi-HIS-OUR-IND-CNT'”)来修复它到OAuth方法,因为这是写入cookie的地方。现在它就像一个符咒!
    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);
    }
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");
    }
FormsAuthentication.SetAuthCookie(acc.AccountID.ToString(), false);