C#如何在OAuth重定向后保留会话或Cookie信息?

时间:2011-09-21 06:23:10

标签: c# facebook session oauth azure

我让用户使用Facebook登录我的网站。他们被从我的网站发送到Facebook,然后在他们给予网站许可后重定向回来。我面临的问题是访问我们在离开网站之前设置的Session变量。当用户返回站点时,将创建一个全新的会话。奇怪的是,如果用户导航网站,一些页面可以访问原始会话,有时是新创建的会话。 我尝试过创建cookie:     Response.Cookies [“user”] [“LoggedIn”] =“true”; 只要用户没有离开网站,我就可以很好地访问这些cookie,但是一旦他们离开并回来,我似乎也无法访问这些。所以我的问题是,在用户从网站发送到重定向之前,将数据从之前保留的最佳方法是什么?

AccountController:

public void Login()
{
    Session["BeforeLogin"] = "foo";
    redirect(FacebookUrl);
}

//Where Facebook redirects the user back to
public ActionResult OAuth(string code, string state)
{
    if (LoginSuccessful)
    {
        Session["LoggedIn"] = true;
    }
    return View();
}

HomeController:
    public HomeController()
{
    setLoggedInSession();
}

public void setLoggedInSession()
{
    //This is where I'm having the inconsistency
    string foo = Session["BeforeLogin"];
    ViewData["LoggedIn"] = Session["LoggedIn"];
    //It'll either be BeforeLogin is null and LoggedIn is true
    //or BeforeLogin will be "foo" and LoggedIn will be null
}

编辑: 有关此问题的一些新信息。做一些测试我发现当我只使用单个实例时,Session似乎工作正常。当我做高可用性时(运行5个实例)是我开始遇到问题的时候。最明显的是在IE中。我的假设是,当你从Facebook重定向回到网站时,你得到的是与你离开的不同的实例,它会在它管理检索原始会话之前创建一个新的会话。

5 个答案:

答案 0 :(得分:1)

我的猜测是你正在使用会话状态的默认模式,这是基于进程模式的cookie。

使用默认模式,您需要描述的行为。您在单个VM的单个进程的内存中设置值,这不会神奇地转到另一个VM或进程。由于Azure可以自由地将您的请求路由到任何实例,因此只有运气好,才能获得您设置的相同会话值。实际上,如果您尝试的时间足够长,您应该会看到即使使用单个实例,当VM重新启动时,会话值也会消失,或者IIS会回收您的工作进程。

会话状态模式http://msdn.microsoft.com/en-us/library/ms178586.aspx中有相当多的信息。

但我的建议是避免使用会话状态。当您掌握会话时,您将熟悉IIS管道中的http处理,您将不再需要此抽象。

答案 1 :(得分:0)

AppFabric缓存: “跨Windows Azure AppFabric和Windows Server AppFabric的一致开发模型。 访问控制服务提供安全访问和授权。“ 它对任何一个实例都不是驻留的。

答案 2 :(得分:0)

如果你想使用持久性cookie,你需要这样的东西:

Response.Cookies.Add(new HttpCookie("name", "value") { Expires = DateTime.UtcNow + TimeSpan.FromDays(7) });

答案 3 :(得分:0)

如果cookie中断,您可以通过在回调Url中添加查询字符串参数来解决此问题,如果查询字符串参数存在,则将其填充到会话数据中。

当发送动态查询字符串参数时,Facebook应用程序回调不会失败验证,并将它们传回给它们发送的相同内容。

答案 4 :(得分:-1)

问题是当Facebook进行回调时,请求中没有传递会话cookie,因此.Net创建了一个新的。如果你在运行fiddler时进行调试,你应该看到这个。

如果要传递变量,请将其置于回调QueryString中,或使用ajax发出请求。 Social Plugins非常适合这种事情。

顺便说一下,希望您知道在会话中存储任何类型的身份验证/授权是完全不安全的。我认为你的代码只是用于调试,但我想我会提到它。