C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: cookieを削除するには?


(過去ログ 57 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■32106 / inTopicNo.1)  cookieを削除するには?
  
□投稿者/ mino (2回)-(2009/02/01(Sun) 18:42:15)

分類:[VB.NET/VB2005 以降] 

2009/02/01(Sun) 20:20:40 編集(投稿者)

VB2005でWEBアプリを作っています。
ボタンをクリックすると、特定のサイトにアクセスし、
自動ログオンさせています。
しかし、再度、ボタンをクリックするとcookieを保持しているためか、
ログオン画面が表示されず、認証後の画面が表示されます。

ボタンをクリックすると、毎回、ログオン画面をだして、
自動ログオンさせたいと思います。
cookieを削除(クリア)すれば実現できるかなと思っています。

InternetSetCookieというAPIで処理できそうな過去ログを見つけましたが、
具体的なコードがなく、どのようにコードを書けば良いか不明です。
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200302/03020025.txt

お手数ですが、ご存じの方がいましたら、教えて頂けませんか。
よろしくお願い致します。
引用返信 編集キー/
■32109 / inTopicNo.2)  Re[1]: cookieを削除するには?
□投稿者/ biac (31回)-(2009/02/01(Sun) 20:30:46)
biac さんの Web サイト
No32106 (mino さん) に返信
> VB2005でWEBアプリを作っています。
> ボタンをクリックすると、特定のサイトにアクセスし、
> 自動ログオンさせています。
> しかし、再度、ボタンをクリックするとcookieを保持しているためか、
> ログオン画面が表示されず、認証後の画面が表示されます。

ぇえと…?

・VB2005 で制作中の WEBアプリ の持ち物
ボタン

・特定のサイト (VB2005 で制作中の WEBアプリとはドメインが異なる) の持ち物
ログオン画面、 認証後の画面、 cookie

…っていう理解で合ってますか?
でしたら、 他人の (別ドメインの) 持ち物 (cookie) を勝手にいじることは、 Web ブラウザでは出来ません。 もしも出来たとしたら、 それはその Web ブラウザのセキュリティホールです。

※ Web ブラウザと関係無く、 ローカルコンピュータ上でプログラムを実行させるなら、 可能です。
引用返信 編集キー/
■32112 / inTopicNo.3)  Re[2]: cookieを削除するには?
□投稿者/ 太郎冠者 (1回)-(2009/02/01(Sun) 21:54:43)
情報共有のためにリンクします。
http://hpcgi1.nifty.com/MADIA/vbnet/wwwlng.cgi?print+200902/09020002.txt
引用返信 編集キー/
■32121 / inTopicNo.4)  Re[3]: cookieを削除するには?
□投稿者/ mino (3回)-(2009/02/02(Mon) 00:24:22)
2009/02/02(Mon) 00:26:47 編集(投稿者)
2009/02/02(Mon) 00:26:41 編集(投稿者)

ご回答ありがとうございます。
また、質問が曖昧ですいません。

VB2005でWebBrowserコントロールを使用して
あるサイトに自動ログオンしています。
コードは下記の通りです。

Private Sub Button1_Click・・・
  WebBrowser.Navigate(サイトのURL)
End Sub

Private Sub WebBrowser_DocumentCompleted・・・

  Dim elements As HtmlElementCollection

  Me.WebBrowser.Document.All.GetElementsByName("要素名")(0).InnerText = "ユーザー名"
  Me.WebBrowser.Document.All.GetElementsByName("要素名")(0).InnerText = "パスワード"
  elements = WebBrowser.Document.GetElementsByTagName("input")
  For Each element As HtmlElement In elements
    If element.GetAttribute("value") = "ログイン" Then
      element.InvokeMember("click")
      Exit For
    End If
  Next
End sub

初回実行時にボタンをクリックすると自動ログオンできます。
しかし、そのまま、再度、ボタンをクリックすると、
ログオン情報を保持している為かログオンが完了した後の画面(認証後の画面)に進んでしまいます。

先の質問の過去ログに
『有効期限のないcookieは、メモリ上のみにおかれますので、
セッションが終了すると、cookieそのものも消えてしまいます。』
とあったので、この処理をボタンをクリックした時に実施したいと思います。

InternetSetCookieのAPIを使えばできるのかな?と思い、調べているんですが、
コードをどのように書けば良いのかわからず、行き詰まっています。

よろしくお願い致します。
引用返信 編集キー/
■32128 / inTopicNo.5)  Re[4]: cookieを削除するには?
□投稿者/ 【報告】 (3回)-(2009/02/02(Mon) 10:39:56)
この質問は、下記のとおりマルチポストです。
マナーを守って使用するべきだと思います。

http://hpcgi1.nifty.com/MADIA/vbnet/wwwlng.cgi?print+200902/09020002.txt

回答が判明次第、両方のサイトに回答を書いてください。
マルチポストした場合の最低限のマナーです。

引用返信 編集キー/
■32130 / inTopicNo.6)  Re[4]: cookieを削除するには?
□投稿者/ biac (33回)-(2009/02/02(Mon) 10:48:12)
biac さんの Web サイト
No32121 (mino さん) に返信
> VB2005でWebBrowserコントロールを使用して
> あるサイトに自動ログオンしています。

ぁあ、なるほど。

それなら、 WebBrowser.Document.Cookie プロパティに叩きこんでやれば…
…と思ったら、それでは上手くいかないのですね orz
http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/f0842170-3705-4311-89d6-d697d1100033/
※ クッキーが上書きされず、同じ名前で複数出来てしまう。

> 先の質問の過去ログに
> 『有効期限のないcookieは、メモリ上のみにおかれますので、
> セッションが終了すると、cookieそのものも消えてしまいます。』
> とあったので、この処理をボタンをクリックした時に実施したいと思います。

セッションクッキーなら、WebBrowser オブジェクトを一度破棄して再生成すれば良いような気がしますが…

> InternetSetCookieのAPIを使えばできるのかな?と思い、調べているんですが、
> コードをどのように書けば良いのかわからず、行き詰まっています。

…ともあれ、そこまで分かっているのなら、すぐに見つかりますよ?

http://msdn.microsoft.com/en-us/library/aa385107(VS.85).aspx
> MSDN Library - InternetSetCookie Function
/*
Cookies created by InternetSetCookie without an expiration date are stored in memory and are available only in the same process that created them.
*/

InternetSetCookie() を使ってセッションクッキーをセットすることが出来るようですね。 で、 同一プロセスなら有効である、と。
作ろうとしている WinForm (?) プログラムと WebBrowser オブジェクトが同じプロセスで動いてるなら、 いけそうです。

http://www.microsoft.com/communities/newsgroups/list/en-us/default.aspx?dg=microsoft.public.vb.controls.internet&tid=692f0c25-a20d-405d-8bf4-dd3fd2bf98b1&cat=en_us_006c6f39-dfd6-4df1-82d4-72f5675a76ff&lang=en&cr=us&sloc=&p=1
> Microsoft Communities Worldwide - How to add cookie with axWebBrowser
/*
Due to WinInet design, WebBrowser's Navigate or Navigate2 cannot set the
cookies in the extra headers. You will need to use WinInet API
InternetSetCookie to workaround this:

Private Declare Function InternetSetCookie Lib "wininet.dll" _
Alias "InternetSetCookieA" _
(ByVal lpszUrlName As String, _
ByVal lpszCookieName As String, _
ByVal lpszCookieData As String) As Boolean

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
InternetSetCookie("http://server/asp/", "test", "foo")
AxWebBrowser1.Navigate2("http://server/asp/test.asp")
End Sub
*/

この例では "test=foo" というセッションクッキーをセットしていますが、 第3引数を String.Empty にしてやれば良いのでは。


PS. お二方からマルチポストの指摘が入ってますね。 最終的なまとめ (上手くいったら、その具体的な解決方法、上手くいかなかったら、出来なかった原因) を、それぞれの掲示板を読んでいる人にわかるように、両方の掲示板に報告してくださいね。 > mino さん
引用返信 編集キー/
■32204 / inTopicNo.7)  Re[5]: cookieを削除するには?
□投稿者/ mino (4回)-(2009/02/03(Tue) 13:54:06)
2009/02/03(Tue) 13:55:51 編集(投稿者)
ご回答ありがとうございます。

その後、教えて頂いた情報を元にいろいろ試しましたが、うまく処理することができず・・・

> セッションクッキーなら、WebBrowser オブジェクトを一度破棄して再生成すれば良いような気がしますが…

下記のようにやろうとしたのですが、これだとボタンを押す度にという要件が満たせません。
私のやり方がおかしいと思うのですが・・・

        webBrowser.Dispose()
        Dim webbrowser2 As New WebBrowser
        TabPage1.Controls.Add(webbrowser2)
        webbrowser2.Dock = DockStyle.Fill


> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles Button1.Click
> InternetSetCookie("http://server/asp/", "test", "foo")
> AxWebBrowser1.Navigate2("http://server/asp/test.asp")
> End Sub
> この例では "test=foo" というセッションクッキーをセットしていますが、 第3引数を String.Empty にしてやれば良いのでは。

上記のコードを参考に処理させてみたのですが、セッションクッキーを保持したままでした。

やむを得ず、不細工なやり方だと思いますが、下記のように処理させることにしました。

	'セッションクッキー対策
	If InStr(webBrowser.Document.Body.InnerText, "ログオン後のサイトのみに含まれる文字列") = 0 Then
	    webBrowser.Navigate(URL)
	    Exit Sub
	End If
	Me.webBrowser.Document.All.GetElementsByName("要素名")(0).InnerText = "ユーザー名"
	Me.webBrowser.Document.All.GetElementsByName("要素名")(0).InnerText = "パスワード"
	elements = webBrowser.Document.GetElementsByTagName("input")
	For Each element As HtmlElement In elements
	    If element.GetAttribute("value") = "ログイン" Then
	        element.InvokeMember("click")
	        Exit For
	    End If
	Next


> PS. お二方からマルチポストの指摘が入ってますね。

はい、普段、掲示板を参照するだけで、今回、初めて書き込ませて頂いたので、
マルチポストということを知らず、ご迷惑をお掛けしました。
いろいろとご協力ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -