使用C#HttpClient在两个请求之间保持PHP会话的活动状态
我想知道是否有可能在两个请求之间保持PHP会话的活动状态 我使用以下方式处理请求: 在PHP部分(API)中: 但出于某种原因,每次我执行下一步(Post)时,api都会返回没有任何会话正在运行的消息 正如你在这里看到的:使用C#HttpClient在两个请求之间保持PHP会话的活动状态,c#,php,session,dotnet-httpclient,flurl,C#,Php,Session,Dotnet Httpclient,Flurl,我想知道是否有可能在两个请求之间保持PHP会话的活动状态 我使用以下方式处理请求: 在PHP部分(API)中: 但出于某种原因,每次我执行下一步(Post)时,api都会返回没有任何会话正在运行的消息 正如你在这里看到的: 我一直在读,所有的答案都是一样的,我必须用饼干,饼干做什么?存储服务器应该保留的秘密?我需要知道如何在同一个会话中处理两个请求,或者至少在可能的情况下,因为我不想使用MySQL(带有ID系统,即),我更喜欢保持它的简单性。HTTP是一个无状态协议,这是“保持会话活动”的唯一
我一直在读,所有的答案都是一样的,我必须用饼干,饼干做什么?存储服务器应该保留的秘密?我需要知道如何在同一个会话中处理两个请求,或者至少在可能的情况下,因为我不想使用MySQL(带有ID系统,即),我更喜欢保持它的简单性。HTTP是一个无状态协议,这是“保持会话活动”的唯一方法是在查询字符串中提供会话标识符,或者通过包含作为第一个身份验证请求的一部分返回的cookie来提供会话标识符 这是用户从web浏览器或甚至在cURL中访问web应用程序的典型范例 从SOAP时代到现在,大多数API的设置都不同。他们让你对每个请求进行身份验证。只是在如何使用它们方面更加实用。。。从服务器端代码或使用Xhr客户端 例如,现在使用身份验证是一种常见的方法。您可以向最终用户公开带有签名令牌的URI,并且不必担心可能的重播攻击 我想你应该读这篇优秀的文章,而不是我试图解释: 当涉及到
会话
和cookie
时,PHP中有很多秘密,值得查看手册中与这两个会话相关的INI设置部分
好的,那么API是PHP代码,对吗
session_start()创建一个会话,或根据该会话恢复当前会话
通过GET或POST请求传递的会话标识符,或通过
饼干
好的第一步可能是通过web浏览器向API发出请求,然后查看响应,您是否看到服务器发送的cookie
在对API的后续请求中,您是否看到正在使用这些Cookie?我们假定不会要求您重新验证?这就是要点。同样,根据API cookie会话的性质,可能不是最好的方法
所以,看起来您使用的HTTP包装器中添加了对cookies的支持
可能是一种更本土化的方法 当您使用web应用程序进行身份验证时,将创建一个会话。该会话由客户端跨请求维护,包括后续请求中的那些cookie(是的,cookie中可能有会话标识符)。也许看一个卷曲饼干罐的例子?哦,它是相反的,甚至更好。这里有一个例子:呃,不得不把这个问题重读几遍。。。API是如何处理身份验证的?谢谢@ficuscr我读了你在cookie中提到的关于ID的内容,以及它在后续请求中的存在,但我不明白我的可能性是什么,这个ID就像人们回答说,使用这个ID,你可以从上一次会话中获取数据。尝试将其更改为:使用(FlurlClient客户端=新建FlurlClient().EnableCookies())@DavidMoore这只启用cookie,但我真的不知道如何使用它们来保持会话活动或创建标识系统。因此,如果不使用标识符,就无法实现这一点,SQL还有其他选择,因为我仍然不理解cookie中的标识符是如何工作的,如果您提供一个示例,它将我很好。是的,我正在学习如何使用JWT,另外,我发布了一个关于C#的JOSE-JWT实现的问题,你也可以看到项目标题。谢谢!!我认为这是理所当然的,很多年前从VB转向web开发,有一些范式的转变。强烈建议养成检查请求和客户端和服务器之间的响应。Wireshark或至少是“浏览器工具”。我将尝试在我的回答中提供一个更好的示例。
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();
}
//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;