Frage

Ich mag eine Seite in einem Web-App von einer Desktop-Anwendung navigieren. „Kein Problem“, höre ich Sie sagen: „Feuer nur den Standard-Browser mit der richtigen URL“. Jedoch verwendet der Web-App ASP.NET Formularauthentifizierung und die Benutzer nicht mögen, dass die Login-Seite sehen, weil sie bereits mit den gleichen Anmeldeinformationen in der Desktop-Anwendung authentifiziert haben.

Das klingt einfach genug, alles, was ich tun muß, ist emit ein HTTP-POST von der Desktop-Anwendung mit, dass die Postbacks aus dem Login-Seite des Web-App täuscht. Der Web-App wird dann sein Authentifizierungsticket und Sitzungsstatus Cookies, bringt sie zu mir, und ich werde sich im IE Cookie speichern speichern. Ich kann dann navigate auf die gewünschte Seite und die Web-App wird denken, dass es bereits authentifiziert.

Ich habe einige Arbeitscode, der die HTTP-POST-Konstrukten, sendet sie ab und bekommt eine gültige Antwort, die richtigen Cookies enthalten. Allerdings kann ich nicht sehen, wie sie in den IE Cookie Speicher zu schreiben. Kann jemand Punkt mich in die richtige Richtung?

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,
});
War es hilfreich?

Lösung

Sie müssen den nicht verwalteten InternetSetCookie nennen ( ) Funktion. Und schau! Jemand schrieb die Interop bereits für Sie. Sie sollten allerdings seine Richtigkeit überprüfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top