1

私はWPFクライアントをPHPサーバーに接続し、ログインして「IsLogged.php」をフェッチして、クライアントがログインしていることを検証しようとしました。ただし、「IsLogged.php」は常にクライアントがログインしていないことを返します認証されましたが、何が間違っていますか?

サーバーコード:

「CreateAccount.php」

session_start();

if (isset($_POST['user']))
{
    $_SESSION['UserName'] = $_POST['user'];
    echo "check";
}

「IsLogged.php」

session_start();

if (isset($_SESSION['UserName']))
{
    echo "allowed";
}
else
{
    echo "not allowed";
}

クライアントコード:

「ポスト」方式

    public static string Post(string RequestName, string PostData, out HttpStatusCode ReturnCode)
    {
        byte[] byteArray = Encoding.UTF8.GetBytes(PostData);

        WebRequest Request = WebRequest.Create(ChatAPI.Settings.BaseUrl + RequestName);
        Request.Method = "POST";
        Request.ContentType = "application/x-www-form-urlencoded";
        Request.ContentLength = byteArray.Length;

        Stream dataStream = Request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();

        WebResponse response = Request.GetResponse();
        dataStream = response.GetResponseStream();

        ReturnCode = ((HttpWebResponse)response).StatusCode;

        StreamReader reader = new StreamReader(dataStream);
        string returnedData = reader.ReadToEnd();

        reader.Close();
        dataStream.Close();
        response.Close();

        return returnedData;
    }

最後に、POST リクエストをトリガーするウィンドウです。

        HttpStatusCode Code;
        MessageBox.Show(General.Post("IsLogged", "", out Code)); --> Not allowed (intended)
        MessageBox.Show(General.Post("CreateAccount", "user=jan", out Code)); --> check (intended)
        MessageBox.Show(General.Post("IsLogged", "", out Code)); --> Not allowed (should be allowed)

サーバーがリクエストをセッションとして登録しないのはなぜですか?

4

1 に答える 1

0

サーバーがクライアント (および対応するセッション状態) を識別する方法は、Cookie を使用することです。

基本的に、CreateAccountリクエストでは、サーバーはそのレスポンスに Cookie を添付し、クライアントが後続のすべてのリクエストで Cookie を提示することを期待します。

Cookie が要求に存在しない場合、サーバーはクライアントを識別する方法がなく、その要求を不明な送信元からのものとして扱います。

あなたのコードは Cookie をまったく管理していないため、C# クライアントは常に PHP サーバーにとって新しいクライアントのように見えます。

サーバーから受け取った Cookie を保存し、新しいリクエストごとに提示する最も簡単な方法は、 のインスタンスを使用して、作成するすべてのリクエストCookieContainer添付することです。

私はこのコードを試していないので、構文について 100% 確信があるわけではありませんが、出発点は次のとおりです。

// this instance will be reused across multiple requests
private static CookieContainer cookieContainer = new CookieContainer();

public static string Post(string RequestName, string PostData, out HttpStatusCode ReturnCode)
{
    byte[] byteArray = Encoding.UTF8.GetBytes(PostData);

    WebRequest Request = WebRequest.Create(ChatAPI.Settings.BaseUrl + RequestName);
    Request.Method = "POST";
    Request.ContentType = "application/x-www-form-urlencoded";
    Request.ContentLength = byteArray.Length;

    Request.CookieContainer = cookieContainer; // this line is new

    Stream dataStream = Request.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();

    WebResponse response = Request.GetResponse();
    dataStream = response.GetResponseStream();

    ReturnCode = ((HttpWebResponse)response).StatusCode;

    StreamReader reader = new StreamReader(dataStream);
    string returnedData = reader.ReadToEnd();

    reader.Close();
    dataStream.Close();
    response.Close();

    return returnedData;
}
于 2013-09-20T21:59:20.353 に答える