C#でフォーム認証のページにアクセス


C#で作ったWinアプリで、Webページにアクセスすることは、実に簡単にできます。 ■WebClientクラス WebClientクラスは、面倒な設定をラップして、簡単にWebページをダウンロードすることができます。 このクラスを使ってページを読み出してリンクを抽出するなんてことは、ちょいちょいです。(笑) このクラスに、DownloadDataメソッドがあるのですが、これを使うと与えたURLのページを取得することができます。 このメソッドはバイト配列を返すので、結果をEncodingクラスを使って文字列に変換します。 private string GetWebPage(string URL) { WebClient aWeb = new WebClient(); byte[] aData = aWeb.DownloadData (URL); string aPage= Encoding.ASCII.GetString( aData ); return aPage; } URLはhttp://から始まる普通のアドレスです。 与えるURLには、クエリー文字列も与えることが可能です。 文字列としてページが取得できますので、後は目的に合わせてHTMLタグの解析等を行うことになります。 さて、一般的なページの場合は、実に便利に使えるのですが、フォーム認証を行っているページにアクセスしようとすると、
ログインしなければ保護されたページにアクセスできないので、WebClientが使えません。 普通のブラウザでフォーム認証を行っているページにアクセスした場合、ログインのページにリダイレクトされ、
そこで、ログイン処理を行い、認証されると、目的のページにアクセスできるようになります。 認証が行われると、サーバーから認証クッキーが送られ、次にページ要求を出す時に、この取得した認証クッキーを付けることで、
サーバーが認証ユーザーとして認識します。 WebClientのレファレンスを見ると、クッキーに関するプロパティもメソッドも見当たりません。 色々調べたのですが、方法は発見できずで、断念しました。 ■HttpWebResponse HttpWebRequestクラス そこで、WebClientの下位クラスのHttpWebResponseとhttpWebRequestを使うことにしました。 これらのクラスにはクッキーをハンドリングできるプロパティやメソッドが公開されています。 で、以下の動作シナリオを考えました。 1 WebResponseでページに要求を出すとログインページにリダイレクトされるので、
ここでブラウザと同じようにユーザー名とパスワードをPOSTするフォームの処理と等価なことを行うことを考えた。 2 サーバーからは認証クッキーが発行されるので、それを受け取って一旦記憶する。 3 目的のページを要求する場合に、受け取った認証クッキーを一緒に付ける。 サンプルコードを書いてテストした結果、この方法はうまく行きました。 参考までに、ページ取得のコードを紹介しておきます。 using System.NET; using System.Text; using System.IO; private static CookieContainer aCookieContainer; private void login(string user,string pass) { aCookieContainer= new CookieContainer(); // ここにログインのPOST処理を挿入する。 // 説明のため便宜上クエリ文字列にユーザー名をパスを与えるようにします。 // 本当はフォームのPOSTのコードにします。(^^; string aURL="http://localhost/myweb/login.aspx?usr="+user+"&pass="+pass; GetPageData(aURL); // これで認証クッキーが貰えるはず。 } private string GetPageData(string URL) { HttpWebRequest webreq =(HttpWebRequest)WebRequest.Create(URL); webreq.CookieContainer = new CookieContainer(); webreq.CookieContainer.Add(aCookieContainer.GetCookies(webreq.RequestUri)); HttpWebResponse webres =(HttpWebResponse)webreq.GetResponse(); CookieCollection cookies =webreq.CookieContainer.GetCookies(webreq.RequestUri); aCookieContainer.Add(cookies); Stream st = webres.GetResponseStream(); StreamReader sr = new StreamReader(st, Encoding.GetEncoding("shift_jis")); string aspx = sr.ReadToEnd(); sr.Close(); return aspx; } 解説 やってることはCookieContainerを作って、WebRequestで取得したクッキーをコンテナに詰め込んでるだけです。 aCookieContainerはグローバルなので、次の要求を出す時に、ここに入っている内容が使われます。 ページデータはStreamReaderで一旦受けて、それを読み出して戻り値としています。 サンプルではShift_JISにエンコードしています。

© Rakuten Group, Inc.
X
Design a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: