3

デスクトップアプリからウェブアプリのページに移動したい。「問題ありません」とおっしゃっていますが、「デフォルトのブラウザを正しいURLで起動するだけです」とのことです。ただし、WebアプリはASP.NETフォーム認証を使用しており、ユーザーはデスクトップアプリで同じ資格情報を使用して既に認証されているため、ログインページを表示したくありません。

簡単そうに聞こえますが、私がしなければならないのは、デスクトップアプリからHTTP POSTを発行することだけです。これにより、Webアプリのログインページからのポストバックが偽造されます。次に、Webアプリは認証チケットとセッション状態のCookieを設定し、それらを私に返します。私はそれらをIECookieストアに保存します。次に、目的のページに移動すると、Webアプリはそれがすでに認証されていると見なします。

HTTP POSTを構築して送信し、適切なCookieを含む有効な応答を取得する実用的なコードがあります。ただし、IEのCookieストアに書き込む方法がわかりません。誰かが私を正しい方向に向けることができますか?

サンプルコード:

var requestUrl = Properties.Settings.Default.WebsiteLoginPageUrl;

var requestEncoding = Encoding.GetEncoding(1252);

// Simulated login postdata
var requestText = string.Format(
    "__VIEWSTATE={2}&__EVENTTARGET={3}&__EVENTARGUMENT={4}&__EVENTVALIDATION={5}&userNameText={0}&passwordText={1}&submitButton=Log+In",
    HttpUtility.UrlEncode(Properties.Settings.Default.UserName),
    HttpUtility.UrlEncode(Properties.Settings.Default.Password),
    Properties.Settings.Default.FakeViewState,
    Properties.Settings.Default.FakeEventTarget,
    Properties.Settings.Default.FakeEventArgument,
    Properties.Settings.Default.FakeEventValidation);

var request = (HttpWebRequest) WebRequest.Create(requestUrl);
request.Method = "POST";
request.Accept = "*/*";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = requestEncoding.GetByteCount(requestText);
request.Headers.Add(HttpRequestHeader.CacheControl, "no-cache");
request.AllowAutoRedirect = false;
request.KeepAlive = false;
request.CookieContainer = new CookieContainer();

using(var writer = new StreamWriter(request.GetRequestStream(), requestEncoding)) {
    writer.Write(requestText);
}

var response = (HttpWebResponse) request.GetResponse();

// TODO: Grab the response cookies and save them to the interactive desktop user's cookie store.

Process.Start(new ProcessStartInfo {
    FileName = Properties.Settings.Default.WebsiteTargetPageUrl,
    UseShellExecute = true,
});
4

1 に答える 1

2

アンマネージInternetSetCookie()関数を呼び出す必要があります。そして見て!誰かがすでにあなたのために相互運用を書いています。ただし、その正確性を確認する必要があります。

于 2010-09-08T15:45:46.900 に答える