1

いくつかのクエリを実行する前に認証を必要とするローカル Web サイト (私のものではない) があります。認証ヘッダーは次のようになります。

Host: 192.168.7.9
Connection: keep-alive    
Content-Length: 185
Origin: http://192.168.7.9
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/27.0.1453.3 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*
DNT: 1
Referer: http://192.168.7.9/signin
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: _FProEnterprise_session=BAh7CzoVbmVlZF93ZWxjb21lX21zZ1Q6D3Nlc3Npb25faWQiJTUxNjI5OGRiMDNmNjU4ZDg4ODE3NmFiZjhmMDU3YTI2OglzaXRlSSIKc2l0ZTAGOgZFRjoObGFuZ19wYXRoSSIHZW4GOwhUOg5vbmVfY2xpY2tGOgx1c2VyX2lkaRE%3D--0c6634a714baa7f0e4795aee89b31f9b7ec0565e

リクエストの本文は次のようになります。

username=myusername&password=mypassword

私は認証がどのように機能するかについてあまり得意ではありません。まず、これはフォーム認証ですか?サイトにユーザー名とパスワードを入力してから送信する必要があるため、そうであると推測しています。

第 2 に、なぜ Cookie が既に存在するのでしょうか。おそらく以前のセッションからのもので、無視できますか?

私の目標は、これを C# で再現して、認証し、Cookie を取得してから、データを投稿して、このサイトから結果を取得できるようにすることです。少なくともそれは私がする必要があると思うことです。リンクとコードは非常に役立ちます。役に立つ場合は、web.api アプリ コントローラーからこの要求を行う必要があります。

4

4 に答える 4

0

asp.net membership providerのような認証を使用して実行するMembership.ValidateUser()と、フォーム認証も認証されます。次の場合は、認証されているかどうかを確認します(Context.User.Identity.IsAuthenticated)-FormsAuthentication.SignOut();

ユーザー名とパスワードを保存するには、最初にSQLサーバーまたは何らかの認証メカニズムが必要です。

于 2013-03-29T18:35:24.347 に答える
0

これは AJAX リクエスト (X-Requested-With: XMLHttpRequest) のようです。したがって、ユーザーは最初に Web ページにアクセスする必要があります。これは、セッションが開始されたときです。これは、セッションを追跡するために毎回送信されるセッション Cookie をユーザーが取得するときです。このセッションは、ログイン情報が保存されているサーバーにも保持されます - ログインしているかどうか、およびあなたが誰であるか。

コンテンツは単純な HTTP フォームのように見えますが、XMLHttpRequest から取得されているため、Javascript を使用して作成することもできます。これは、少なくとも HTTP 経由で POST データを送信する標準的な方法です。

于 2013-03-29T18:39:38.293 に答える
0

このリンクは私のためにそれを解決しました: HERE

私の最終的なコード(私の web.api コントローラーでは次のようになりました):

    public static string JsonWithAuth( string url, string data )
    {
        var bytes = Encoding.Default.GetBytes( data );

        using ( var client = new WebClientEx() )
        {
            var values = new NameValueCollection
            {
                { "username", "myUsername" },
                { "password", "myPassword" },
            };
            // Authenticate
            client.UploadValues( "http://192.168.7.9/main/signin", values );

            // Post data
            var response = client.UploadData( url, "POST", bytes );

            return Encoding.Default.GetString( response );
        }
    }

そして、これはそれを機能させたクラスでした(リンクされた回答から):

/// <summary>
/// A custom WebClient featuring a cookie container
/// </summary>
public class WebClientEx : WebClient
{
    public CookieContainer CookieContainer { get; private set; }

    public WebClientEx()
    {
        CookieContainer = new CookieContainer();
    }

    protected override WebRequest GetWebRequest( Uri address )
    {
        var request = base.GetWebRequest( address );
        if ( request is HttpWebRequest )
        {
            ( request as HttpWebRequest ).CookieContainer = CookieContainer;
        }
        return request;
    }
}

したがって、私の最終的な呼び出しは次のようになりました。

string sampleInfo = JsonWithAuth(
    "http://192.168.7.9/samples/sample_locations_list",
    "sort=position&dir=ASC&box_id=");

それが他の誰かを助けることを願っています!

于 2013-03-29T22:45:08.840 に答える
0

これはプレーン HTTP 認証を使用しており、Cookie は古いセッションからのものです。

http://en.wikipedia.org/wiki/Basic_access_authentication

于 2013-03-29T18:33:37.273 に答える