Domanda

Voglio passare a una pagina in una web app da un'applicazione desktop. "Nessun problema", ho sentito dire, "solo avviare il browser predefinito con l'URL corretto". Tuttavia, l'applicazione web utilizza ASP.NET Forms Authentication, e non gli utenti non vogliono vedere la pagina di login perché hanno già autenticato con le stesse credenziali nel un'applicazione desktop.

che suona abbastanza semplice, tutto quello che devo fare è emettere un HTTP POST dall'applicazione desktop con che finge il postback dalla pagina di login del web app. L'applicazione web sarà quindi impostare il ticket di autenticazione e biscotti stato della sessione, restituirli a me, e io li conservare nel negozio cookie di IE. Posso quindi accedere alla pagina desiderata e la web app penserà che è già autenticato.

Ho qualche codice di lavoro che costruisce l'HTTP POST, lo manda via, e ottiene una valida risposta contenente i biscotti di destra. Tuttavia, non riesco a vedere come li scrivere in negozio cookie di IE. Qualcuno può punto me nella giusta direzione?

Codice di esempio:

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,
});
È stato utile?

Soluzione

È necessario chiamare il non gestito InternetSetCookie ( ) funzione . E guarda! Qualcuno ha scritto l'interoperabilità per voi già. È necessario verificare la correttezza però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top