Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C如何在OAuth重定向后持久化会话或Cookie信息?_C#_Facebook_Session_Oauth_Azure - Fatal编程技术网

C# C如何在OAuth重定向后持久化会话或Cookie信息?

C# C如何在OAuth重定向后持久化会话或Cookie信息?,c#,facebook,session,oauth,azure,C#,Facebook,Session,Oauth,Azure,我让用户使用Facebook登录到我的网站。他们被从我的网站发送到Facebook,然后在获得网站许可后重定向回来。我面临的问题是访问我在离开站点之前设置的会话变量。当用户返回站点时,将创建一个全新的会话。奇怪的是,如果用户浏览站点,可以访问原始会话的某些页面,有时还可以访问新创建的会话。 我尝试过创建cookies: 响应.Cookies[user][LoggedIn]=true; 只要用户还没有离开网站,我就可以访问这些cookie,但一旦他们离开并回来,我似乎也无法访问这些cookie。所

我让用户使用Facebook登录到我的网站。他们被从我的网站发送到Facebook,然后在获得网站许可后重定向回来。我面临的问题是访问我在离开站点之前设置的会话变量。当用户返回站点时,将创建一个全新的会话。奇怪的是,如果用户浏览站点,可以访问原始会话的某些页面,有时还可以访问新创建的会话。 我尝试过创建cookies: 响应.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
}
编辑:
关于这个问题的一些新信息。在进行一些测试时,我发现当我只使用一个实例时,会话似乎工作正常。当我运行5个实例实现高可用性时,我开始遇到这些问题。最明显的是在IE中。我的假设是,当你从Facebook重定向回站点时,你会得到一个不同于你离开的实例,它会在管理和检索原始会话之前创建一个新会话。

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

如果要传递变量,请将其放入回调查询字符串中,或者使用ajax发出请求。对这类事情很有用

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

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

如果您想使用持久性cookie,您需要以下内容:

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

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


发送动态查询字符串参数时,Facebook应用程序回调不会失败验证,并将其传回发送时的状态。

我猜您正在使用会话状态的默认模式,即基于cookie的过程模式

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

在会话状态模式中有很多信息


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

-1:Facebook或任何其他网站无法更改特定域上的cookies集。只有同一个/父域上的站点才能更改Cookie。但其余的都很有用。。。在我试着写我的之后:-和Fiddler一起检查你有什么cookie,看看它们在哪里丢失-我打赌客户端cookie是可以的,但是你实际上因为一些东西而失去了会话状态,因为你在常规导航上也看到了这种行为。我说过Facebook可以吗?我的观点是回调不包含会话cookie,因此asp.net会创建一个新会话。是的。。。请编辑后,我可以删除我的投票。。。而且我仍然认为问题是。。。没有一个cookie不可能是真的,因为即使返回302,第一个对Jchysk站点的请求也会设置cookie。我可以看到通过querystring发送了一堆信息,问题是如果我想把这些信息放回会话中。基本上,我可以访问这些信息,因为这两个会话之间会被复制,但其他一些东西,比如用户是否登录,将区分这两个会话。另外,我不知道为什么您认为在会话中存储用户的状态是不安全的。我是.NET开发的新手,但在其他框架中,这是跟踪用户会话的典型方法。是的,如果您有两个实例,并且只使用进程内会话提供程序,那么您将遇到此问题。使用appfabric缓存会话提供程序或 sql server会话提供程序应该可以解决您的问题。