使用C#HttpClient在两个请求之间保持PHP会话存活

时间:2018-05-08 21:35:54

标签: c# php session dotnet-httpclient flurl

我想知道是否可以在两个请求之间保持PHP会话活动...

我使用Flurl plugin执行请求:

    public const string ApiUrl = "http://localhost/z/api.php";

    public static string MethodName()
    {
        using (FlurlClient client = new FlurlClient())
        {
            string res = client.HttpGet(string.Format("{0}?action={1}", ApiUrl, "captcha"), true);

            //Some actions...

            return client.HttpPost(ApiUrl, new { action = "resolve-captcha", input = r }, false);
        }
    }

    public static string HttpPost(this FlurlClient client, string url, object data, bool keepalive = false)
    {
        return client.Request(url).PostUrlEncodedAsync(data).ReceiveString().GetAwaiter().GetResult();
    }

    public static string HttpGet(this FlurlClient client, string url, bool keepalive = false)
    {
        return client.Request(url).GetStringAsync().GetAwaiter().GetResult();
    }

在PHP部分(API)中:

//if isset $_GET then switch action key...
case "captcha":
    if (session_status() == PHP_SESSION_NONE)
        session_start();

    $_SESSION['phrase'] = "hello";
    break;

//if isset $_POST then switch action key...
case "resolve-captcha":
    $secret = @$_SESSION["phrase"];

    if(session_status() == PHP_SESSION_NONE)
        die("No session!");
    else
        $coreData["secret"] = $secret;

    $input = @$_POST["input"];
    $coreData["valid"] = $input === $secret;
    break;

但出于某种原因,每次我执行下一步(Post)时,api都会返回没有任何会话在运行。

正如你在这里看到的那样:

...

我一直在阅读并且所有的答案都是这样说的,我必须使用cookies,cookie来做什么?存储服务器应保留的秘密?我需要知道如何使用相同的会话执行两个请求,或者至少如果这是可能的,因为我不想使用MySQL(使用ID系统,即),我更喜欢保持简单。

1 个答案:

答案 0 :(得分:1)

HTTP是一种无状态协议,“保持会话处于活动状态”的唯一方法是在查询字符串中提供会话标识符,或者包含作为第一个身份验证请求的一部分返回的cookie。

这是用户从Web浏览器访问Web应用程序的典型范例,甚至是cURL。

大多数API,可以追溯到现在的SOAP时代,以不同的方式设置。他们让您对每个请求进行身份验证。从服务器端代码或Xhr客户端使用它们的方式更加实用。

例如,使用JWT tokens进行身份验证是目前常见的做法。您可以将带有签名令牌的URI公开给最终用户,并且没有潜在的重播攻击,不必担心。

我认为应该阅读这篇优秀的文章而不是我试图解释你:http://shiflett.org/articles/the-truth-about-sessionssessionscookies中,PHP中有很多内容正在进行中 - 值得查看手册中与这两个相关的INI设置的部分。

好的,所以API是正确的PHP代码......?

  

session_start()创建会话或恢复当前会话   通过GET或POST请求传递的会话标识符,或通过   cookie中。

良好的第一步可能是通过您的网络浏览器向API发出请求,然后查看响应,您是否看到服务器发送了Cookie?

在对API的后续请求中,您是否看到正在使用这些cookie - 我们假设您没有要求您重新进行身份验证?这是它的要点。同样,根据API的性质,基于cookie的会话可能不是最好的方法。

因此,看起来对您使用的HTTP包装器添加了对Cookie的支持... https://github.com/tmenier/Flurl/issues/14

可能是一种更原生的方法? Struggling trying to get cookie out of response with HttpClient in .net 4.5