Cookies von CookieContainer in den IE-Cookie-Speicher schreiben

Ich möchte von einer Desktop-App zu einer Seite in einer Web-App navigieren. "Kein Problem", höre ich Sie sagen, "starten Sie einfach den Standardbrowser mit der richtigen URL". Die Webanwendung verwendet jedoch die ASP.NET-Formularauthentifizierung und die Benutzer möchten die Anmeldeseite nicht sehen, da sie sich bereits mit denselben Anmeldeinformationen in der Desktopanwendung authentifiziert haben.

Das klingt einfach, ich muss nur einen HTTP-POST von der Desktop-App ausgeben, mit dem das Postback von der Anmeldeseite der Web-App gefälscht wird. Die Web-App setzt dann die Cookies für das Authentifizierungsticket und den Sitzungsstatus, sendet sie an mich zurück und speichert sie im IE-Cookie-Speicher. Ich kann dann zur gewünschten Seite navigieren und die Web-App wird denken, dass sie bereits authentifiziert ist.

Ich habe einen funktionierenden Code, der den HTTP-POST erstellt, sendet und eine gültige Antwort mit den richtigen Cookies erhält. Ich kann jedoch nicht sehen, wie sie in den IE-Cookie-Speicher geschrieben werden. Kann mich jemand in die richtige Richtung weisen?

Beispielcode

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,
});

Antworten auf die Frage(2)

Ihre Antwort auf die Frage