Я хочу перейти на страницу в веб-приложении из настольного приложения. «Нет проблем», я слышал, вы говорите: «Просто запустите браузер по умолчанию с правильным URL». Тем не менее, веб-приложение использует ASP.NET Forms Authentication, и пользователи не хотят видеть страницу входа, потому что они уже прошли аутентификацию с теми же учетными данными в настольном приложении.Написание файлов cookie из CookieContainer в хранилище cookie IE
Это звучит достаточно просто, все, что мне нужно сделать, это выпустить HTTP POST из приложения для настольных компьютеров, что приведет к обратной передаче с страницы входа в веб-приложение. Затем веб-приложение установит свой билет аутентификации и файлы cookie состояния сеанса, вернет их мне, и я сохраню их в хранилище cookie IE. Затем я смогу перейти на нужную страницу, и веб-приложение подумает, что оно уже завершено.
У меня есть рабочий код, который создает HTTP POST, отправляет его и получает действительный ответ, содержащий правильные файлы cookie. Однако я не могу понять, как записать их в хранилище cookie IE. Может кто-то указать мне верное направление?
Пример кода:
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,
});
Спасибо, Джефф, это похоже на то, что мне нужно. Просто нужно выяснить, как перевести свойства файла cookie .NET в правильный формат. :-) –
Вызовите InternetGetCookie на известном cookie и посмотрите, как он выглядит. –
Он содержит смешные данные, которые не соответствуют всем свойствам объекта .NET Cookie. Я сейчас реконструирую формат, и я дам вам знать. –