1

C# アプリケーションの開発中 (私の最初の C# アプリ):

  • ユーザーからログイン情報を取得します (ID、パス)。
  • HttpWebRequestASP.NET Web ページへの新しい接続を開きます
  • 取得した [id,pass] タプルでこのページへのログインを試みます。ログインが成功HttpWebRequestすると、別のページへのログインに使用される Cookie がオブジェクトに含まれます。

2 番目の (保護された) ページをリクエストする前に、最初のログインが成功したことを確認したいと思います。最初に、ログインが成功した場合にのみ、サーバーが Cookie を送信すると考えました。そうではありません。:)

受信した Cookie オブジェクトから、ログインが成功したことがわかりますか? または、この問題を解決するために提案できる他の方法はありますか?

4

3 に答える 3

3

すべての返信に感謝します。これが私の奇妙な解決策です。:) 誰かが将来それを必要とするかもしれないので、私はこれを書いています.

受け取った Cookie には、[logged,true] のような特定の [name,value] ペアが含まれていません。私が受け取る唯一のものは次のようなものです:

Set-Cookie: ASP.NET_SessionId=ah0b2kj40oi0vuufv0mmot35; path=/; HttpOnly\r\n

そのため、間違った方向に進んでいると思い、ログインが成功したかどうかを分析する別の方法を見つけようとしました。私の解決策は、応答の StatusCode を使用することです。(エラー コード 401 に関する Jason のコメントに感謝します) ログインが成功すると、サーバーは HTTP 302 Found ステータス コードで応答することに気付きました。しかし、ログインに失敗した場合は、同じログイン ページ (つまり、HTTP 200 OK) で応答します。そのため、受信したレスポンスの HTTP コードに応じて、成功するかどうかを判断します。サンプルコードは次のとおりです。

//In LoginForm.cs
if (((HttpWebResponse)request.GetResponse()).StatusCode.ToString().Equals("Found"))
            {
                    nextUrl = ((HttpWebResponse)request.GetResponse()).Headers.Get(4);
                    StringBuilder FullUrl = new StringBuilder(this.server_address);
                    FullUrl.Append(nextUrl);
                    this.setSecretURL(FullUrl.ToString());

                    setLoginSuccess(true);
                    // now we can send out cookie along with a request for the protected page
                    request = WebRequest.Create(SECRET_PAGE_URL) as HttpWebRequest;
                    request.CookieContainer = cookies;
                    StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());

                    // and read the response
                    result = responseReader.ReadToEnd();
                    responseReader.Close();

     } else 
     {
          setLoginSuccess(false);                   
     }
于 2008-12-25T23:53:32.500 に答える
2

ユーザーが承認されていない場合、Web サーバーは HTTP エラー コード 401 を返す必要があります。

于 2008-12-25T19:56:52.320 に答える
1

私は2つのことのうちの1つをします。

  1. aspx ページを使用する代わりに、Web サービスを使用できます。webservice ログイン メソッドは、Cookie を提供するだけでなく、ログインが成功したかどうかを通知する xml 応答を返します。(一部の StackOverflowers は、Web サービスでの Cookie の使用に同意しない場合がありますが、私はそれらを気に入っています。)

  2. ログインページは、より API に近いものになる可能性があります。あなたのURLが次のようになっているとしましょう:

    http://mywebsite.com/api.aspx?method=login&userid=sampleuser&password=password

    応答 html では、テキストまたは xml のいずれかの解析可能なメッセージを送り返すことができます。たとえば、結果ページに「成功」​​とだけ表示される場合があります。C# アプリケーションはこれを読み取り、正常にログインしたことを確認できます。

    注: POST リクエストでユーザー名とパスワードを送信し、送信前にパスワードをハッシュすることをお勧めします。

幸運を!

于 2008-12-25T20:07:26.700 に答える