У нас есть интранет-сайт около 2010 года, который позволяет нашим пользователям искать данные в наших собственных базах данных.После выбора чего-либо из поиска наш веб-сайт направляет пользователя на страницу, которая проверяет подлинность учетных данных Windows нашего пользователя, на стороннем внешнем веб-сайте.После того, как код позади завершает их регистрацию, он перенаправляет их на их сайт, уже аутентифицированный для дальнейшего использования.
Наша третья сторона обновила свой веб-сайт, и я пытаюсь перенаправить наших пользователей с нашей страницы на их страницу, на которой уже зарегистрирован новый процесс аутентификации (ранее служил), теперь страница входа в формы.
Я могу автоматизировать вход в систему и выполнение всех этапов, используя объект HttpClient, но я пытаюсь переместить ответ этого входа, HttpResponseMessage, в HttpResponse страницы aspx, извлекая файлы cookie и заголовки и предоставляя перенаправление с помощьюокончательный URL.Мой код ниже.
protected void Page_Load(object sender, EventArgs e)
{
string loginurl = GetLoginUrlString();
ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;
handler.UseCookies = true;
var httpClient
= new HttpClient(handler);
string html = httpClient.GetStringAsync(loginurl).Result;
var token = Regex.Match(html, "(?<=__RequestVerificationToken.*value=\")[a-zA-Z0-9-_]*").Value;
HttpContent content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>( "email", GetLoginEmail() ),
new KeyValuePair<string, string>( "Password", GetLoginPassword() ),
new KeyValuePair<string, string>( "__RequestVerificationToken", token )
});
// authentication post
HttpResponseMessage response = httpClient.PostAsync(loginurl, content).Result;
string responseStuff = response.Content.ReadAsStringAsync().Result;
var url = GetRedirectUriString();
// this works but does not translate to 'THIS' aspx page.
HttpResponseMessage myResponse = httpClient.GetAsync(url).Result;
// the html page that we want the user to see (and be authenticated upon)
string redirectedStuff = myResponse.Content.ReadAsStringAsync().Result;
// This is what I am really trying to do...
//I tried moving cookies and headers from the HttpResponseMessage
// to this page's Response object, followed by a redirect to the final
// URL but the authentication does not pass along
foreach (Cookie cookie in cookies.GetCookies(GetCookieDomainUri()))
{
Response.Cookies.Add(new HttpCookie(cookie.Name, cookie.Value)
{ Domain = cookie.Domain, Expires = cookie.Expires });
}
// convert KeyValuePair<string, IEnumerable<string>> to NameValueCollection for Page.Headers
foreach (var header in response.Headers)
{
// each header is a KeyValuePair<string, IEnumerable<string>>,
// this.Response.Headers can only add a <string,string> or a NameValueCollection
foreach (var element in header.Value.ToArray())
{
Response.Headers.Add(header.Key, element);
}
}
// This response is sadly not authenticated and gets a redirect to the login we already did.
Response.Redirect(url);
}
Так где же я ошибаюсь или чего мне не хватает?Любая помощь приветствуется.