如何在OAuth重定向后持久化Session或Cookie信息?
本文关键字:Session Cookie 信息 持久化 OAuth 重定向 | 更新日期: 2023-09-27 18:09:06
我有用户登录到我的网站使用Facebook。他们被从我的网站发送到Facebook,然后在他们给予网站许可后重定向回来。我面临的问题是访问我在离开站点之前设置的Session变量。当用户返回到站点时,将创建一个全新的会话。奇怪的是,如果用户导航站点,原始会话的一些页面可以访问,有时是新创建的会话。我试过制作饼干:响应。Cookies["user"]["LoggedIn"] = "true";只要用户没有离开网站,我就可以访问这些cookie,但一旦他们离开并回来,我似乎也无法访问这些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重定向回网站,你得到一个不同的实例比你离开,它创建一个新的会话之前,它管理检索原来的一个。
我猜您正在使用会话状态的默认模式,这是基于进程模式的cookie。
在默认模式下,您所描述的行为是预期的。您正在单个VM的单个进程的内存中设置值,这些值不会神奇地转到另一个VM或进程中。而且由于Azure可以免费将请求路由到任何实例,因此只能靠运气才能获得与设置相同的会话值。实际上,如果你尝试足够长的时间,你应该看到,即使只有一个实例,你的会话值也会随着VM重启而消失,或者IIS回收你的工作进程。
在http://msdn.microsoft.com/en-us/library/ms178586.aspx中有相当多关于会话状态模式的信息。
但是我的建议是避免使用会话状态。当您掌握会话时,您将非常熟悉IIS管道中的http处理,您将不再需要此抽象。
AppFabric Caching:"横跨Windows Azure AppFabric和Windows Server AppFabric的一致开发模式。访问控制服务提供的安全访问和授权。"
如果你想使用持久cookie,你需要这样做:
Response.Cookies.Add(new HttpCookie("name", "value") { Expires = DateTime.UtcNow + TimeSpan.FromDays(7) });
如果cookie被破坏,您可以通过在回调Url中添加查询字符串参数来解决这个问题,然后如果查询字符串参数存在,则将其填回会话数据。
当发送动态查询字符串参数时,Facebook应用程序的回调不会失败验证,并将它们返回与发送时相同。
问题是,当Facebook进行回调时,请求中没有传递会话cookie,因此。net创建了一个新的。如果在运行fiddler时进行调试,您应该会看到这个。
如果你想传递一个变量,把它放在回调QueryString中,或者使用ajax来发出请求。社交插件对于这类事情非常有用。
顺便说一句,希望你意识到在会话中存储任何类型的身份验证/授权都是完全不安全的。我认为你的代码只是为了调试,但我想我应该提一下。