私はここで NTLM 地獄にいます。私が欠けているものを特定するのを手伝ってくれることを願っています。
私は最終的に SSRS レポートをブラウザーのフレームに配信しようとしていますが、レポート内の画像だけが私に多くの悲しみを与えています。ユーザーが Firefox を使用しており、資格情報を 2 回 (最初はレポート用に、次に 2 回目はレポート内の画像用に) 入力しない限り、それらは表示されません。
SSRS レポートを取得するために HttpWebRequest を使用しています。
HTMLストリームを受信した後、SSRSから画像を取得しようとするために、「NTLM」と有効な資格情報を含む資格情報キャッシュをWebサーバー(IIS 7.5)に送信して、それらをローカルに保存して参照できるようにします。これにより、ユーザーが軽減されます資格情報を何度も再入力する必要がなくなります。
Fiddler では、NTLM ハンドシェイク中にタイプ 1、2、および 3 の課題が適切に満たされていることがわかりますが、最終的な応答は 500 内部サービス エラーです。応答テキストには rsStreamNotFound も示されていますが、それが何を意味するのかについての情報はほとんどなく、実際の問題が何であるかについて誤解を招くと思います。
Firefox を使用すると、Firefox はレポート用のネットワーク資格情報を要求し、次に画像用に再度要求し、画像を元に戻します。HttpWebRequest が 500 Internal Server Error と rsStreamNotFound で失敗します。
Firefox リクエストと私のリクエストのリクエスト ヘッダーで確認できる唯一の違いは、「keep-alive」プロパティがプログラムによるリクエストから削除され、Firefox リクエストにはそれが含まれていることです。
「キープアライブ」が削除されるのはなぜですか?
現時点では、それが私の要求と Firefox からの要求の唯一の違いであるため、他の結論にジャンプする前にその違いを排除したいと思います。
私は次のバリエーションを試しました:
req.KeepAlive = true;
req.PreAuthenticate = true;
そしてこの宝石:
var sp = req.ServicePoint;
var prop = sp.GetType().GetProperty( "HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic );
prop.SetValue( sp, (byte)0, null );
CredentialCache は次のとおりです。
CredentialCache credentialCache = new CredentialCache();
credentialCache.Add( new Uri( path ), "NTLM", NetCredentials );
...そして、「キープアライブ」は私のHttpWebRequestのリクエストに存在せず、Firefoxにはそれがあります-なぜ私のものがドロップされるのですか?
アップデート:
私は試した:
using (WebClient client = new WebClient()) {
client.DownloadFile(url, filePath);
}
...そして 401 Unauthorized を取得したので、資格情報を試してみると 500 Internal Server Error が発生しました