POST送信 認証を分けたい への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 パピ粉  (社会人) 投稿日時 2016/2/25 15:05:54
相手はBASIC認証のところなので今現在の方法でやり方自体は間違っていないようでした。
こうなるともうコード上の問題ではなさそうなのでとりあえず解決済みにします。
ありがとうございました。

Fiddler 2が丁度合ったのでそれで確認してみようと思ったところまずCLR20r3で起動しない嫌がらせを受けました…。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/2/24 18:44:47
> 今は認証情報を毎回つけてやっています。
たとえば BASIC 認証なサイトだとそうなりますね。
「Authorization: Basic credential文字列」を送出するための手続きです。
http://www.atmarkit.co.jp/ait/articles/0103/16/news003.html


認証動作は結局のところ、相手のサーバー次第です。
たとえば辞書攻撃を防ぐため、短時間の連続リクエストに対して
再認証のために WWW-Authenticate を要求してくるケースもありえますし、
いわゆるフォーム認証なら、そもそも Credentials プロパティの
出番そのものが無かったりするわけで(この場合は大抵、cookieが必要になる)。


> 何故か認証情報が空になって相手に届くようです。
どのようなやり取りが行われているのか、Fiddler 等を用いて
トレースしてみては如何でしょうか。
投稿者 パピ粉  (社会人) 投稿日時 2016/2/24 16:31:47
ご回答ありがとうございます。

今は認証情報を毎回つけてやっています。
ただこれだとリクエストとリクエストの間隔が一定より短くなると
何故か認証情報が空になって相手に届くようです。


例えば
Dim url As String = "http~~~~"
Dim wc As New System.Net.WebClient
Dim ps As New System.Collections.Specialized.NameValueCollection
wc.Credentials = New System.Net.NetworkCredential(ID, PW)
ps.Add(パラメータ1,値1)
ps.Add(パラメータ2,値2)
ps.Add(パラメータ3,値3)
Dim resData As Byte() = wc.UploadValues(url, ps)
---ここで何らかの情報を確保----

その確保しておいた情報を2回目以降のリクエストに持たせる。と言う認識であっていますか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/2/24 15:26:38
ご存知の通り、HTTP はそもそも「ステートレス」であるため、
リクエストを分けた場合でも、それぞれの通信内容に関連性はありません。

そのため一般的には、認証成功時に何らかのトークンを受け取り、
それを二回目以降のリクエストに含めることで、認証情報を維持します。
(もしくは、認証情報を毎回毎回リクエストに含めるか…)

このトークンは、URL の QueryString として得るケースもあれば、
cookie を用いる方法や、POST 送信で送るケース、あるいは、
HTTP Header に含める方法などなど、いろいろなパターンなどがあります。

ゆえに、最終的には「サーバー側の設定次第」となりますが、
たとえば cookie でセッション ID あるいはトークンを得るケースなら、
CookieContainer プロパティを使うのが良いでしょう。
http://dobon.net/vb/dotnet/internet/usecookie.html
投稿者 パピ粉  (社会人) 投稿日時 2016/2/24 15:08:55
関連URLなどの欄が使えないので本文に貼ります
http://dobon.net/vb/dotnet/internet/webrequestpost.html#section3
基本的にこれと同じやり方で
.Credentials = New System.Net.NetworkCredential(ID, PW) を追加して認証とPOST送信を行っています。

これを認証だけするリクエストとPOST送信だけするリクエストに分けたいのですが
ASP.NETでやるしかないのでしょうか?