2011-09-21 43 views
1

我有用户使用Facebook登录我的网站。他们被从我的网站发送到Facebook,然后在他们授予网站许可后重新导向。我面临的问题是访问我在离开网站之前设置的会话变量。当用户返回该网站时,会创建一个全新的会话。奇怪的是,如果用户浏览网站,一些页面的原始会话将被访问,有时是新创建的会话。 我试过创建cookie: Response.Cookies [“user”] [“LoggedIn”] =“true”; 只要用户没有离开我的网站,我就可以很好地访问这些饼干,但只要他们离开并回来,我似乎也无法访问这些饼干。所以我的问题是,在用户从网站发送到重定向之前,什么才是保留数据的最佳方式?C#如何在OAuth重定向之后坚持Session或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 
} 

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

回答

0

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

+1

是的,如果您有两个实例,并且您只使用in proc会话提供程序,则会遇到此问题。使用appfabric缓存会话提供程序或sql服务器会话提供程序应解决您的问题。 – knightpfhor

-1

问题在于,当Facebook进行回调时,请求中没有传递会话cookie,因此.Net会创建一个新的会话cookie。如果您在运行小提琴时进行调试,则应该看到这一点。

如果你想通过一个变量把它放在回调QueryString中,或者使用ajax来发出请求。 Social Plugins非常适合这种事情。

顺便说一句,希望你知道存储会话中的任何种类的认证/授权是完全不安全的。我认为你的代码只是为了调试,但我想我会提到它。

+0

-1:Facebook(或任何其他网站)无法更改在特定域上设置的Cookie。只有位于同一/父域的网站才能更改Cookie。 –

+0

但其余的是有用的......在我试图写我的:)后 - 与提琴手检查你有什么饼干,看看他们在哪里丢失 - 我的赌注是在客户端饼干是好的,但你实际上失去会议状态,由于由某些东西引起的应用程序池回收(正如您在常规导航中看到的那样)。 –

+0

我说Facebook可以吗?我的意思是,回调不包含会话cookie,因此asp.net创建一个新的会话。 – TheCodeKing

0

如果你想使用永久性Cookie,你想是这样的:

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

如果cookie被打破,你可以通过在回调URL添加查询字符串参数解决这个问题,那么东东吧如果查询字符串参数存在,则返回到会话数据。

,因为他们在发送的Facebook应用程序回调不验证失败时动态查询字符串参数发送,并将它们放回相同。

1

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

使用默认模式时,您所描述的行为是预期的。您正在为单个虚拟机的单个进程设置值,这不会神奇地转到另一个虚拟机或进程。而且由于Azure可以自由地将您的请求路由到任何实例,因此您只需运气即可获得您设置的相同会话值。实际上,如果尝试足够长时间,即使使用单个实例,当虚拟机重新启动时,会话值也会消失,或者IIS会回收您的工作进程。

有一个在http://msdn.microsoft.com/en-us/library/ms178586.aspx颇有几分informatin的会话状态模式。

但我的建议是避免使用会话状态。当你掌握会话的时候,你会很熟悉IIS管道中的http处理,你不再需要这个抽象了。