Я получаю cookie и использую его, продолжаю эмулировать шаги, которые дают соответствующие шаги браузера.Поскольку автоматическое перенаправление отключено, я должен выполнять каждый шаг отдельно, выбирая местоположение в заголовках ответа, используя его в следующем.После трех таких операций заголовки ответа содержат поле местоположения, но оно пустое.Выполнение соответствующих операций с использованием браузера содержит фактическое местоположение на каждом шаге перенаправления.
private static Uri ObtainExecutor(Uri referer, Uri uri, Cookie cookie)
{
CookieContainer cookieJar = new CookieContainer();
cookieJar.Add(cookie);
HttpClientHandler handler = new HttpClientHandler
{
CookieContainer = cookieJar,
AllowAutoRedirect = false
};
HttpClient client = new HttpClient(handler);
client.DefaultRequestHeaders.Referrer = referer;
client.DefaultRequestHeaders.Host = uri.Host;
HttpResponseMessage response = client.GetAsync(uri).Result;
HttpResponseHeaders headers = response.Headers;
return new Uri(uri, response.Headers.Location);
}
Я понятия не имею, как устранить его в дальнейшем.Я сравнил заголовки, не замечая ничего значимого.Я исказил его с тем же результатом, не в состоянии понять перегрузку входящих пакетов. Конечно, я тоже гуглил это больше недели.
Я уверен, что есть небольшая разницав том, как выполняется вызов, но у меня нет возможности его увидеть.Пример ниже подключается к реальному серверу и показывает место, где отсутствует место перенаправления.(Приношу свои извинения за большой образец - я старался сделать его минимальным, но старался не пропустить соответствующую деталь, неясную для меня.)
class Program
{
static void Main(string[] args)
{
const string url = "https://www.pensionsmyndigheten.se/service/login/login"
+ "?targetPage=https://www.pensionsmyndigheten.se/service/overview/"
+ "&failurePage=https://www.pensionsmyndigheten.se/service/login/error/login-failed"
+ "&cancelPage=https://www.pensionsmyndigheten.se/";
Uri uri = new Uri(url);
Cookie cookie = GenerateCookie(uri);
Uri discovery = DiscoverService(cookie);
Uri execution = ObtainExecutor(uri, discovery, cookie);
Uri conversation = ObtainConversor(uri, execution, cookie);
}
private static Cookie GenerateCookie(Uri uri)
{
CookieContainer cookieJar = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler { CookieContainer = cookieJar };
HttpClient client = new HttpClient(handler);
HttpResponseMessage response = client.GetAsync(uri).Result;
HttpContent content = response.Content;
Cookie cookie = cookieJar.GetCookies(uri)
.Cast<Cookie>()
.First(e => e.Name == "pm_retention_urls");
return cookie;
}
private static Uri DiscoverService(Cookie cookie)
{
string url = "https://www.pensionsmyndigheten.se/service/login/discoresponse"
+ "?spId=default"
+ "&entityID=https%3A%2F%2Feid.legitimeringstjanst.se%2Fmobilt-bankid%2F";
Uri uri = new Uri(url);
CookieContainer cookieJar = new CookieContainer();
cookieJar.Add(cookie);
HttpClientHandler handler = new HttpClientHandler
{
CookieContainer = cookieJar,
AllowAutoRedirect = false
};
HttpClient client = new HttpClient(handler);
client.DefaultRequestHeaders.Referrer = uri;
client.DefaultRequestHeaders.Host = uri.Host;
HttpResponseMessage response = client.GetAsync(uri).Result;
HttpResponseHeaders headers = response.Headers;
return headers.Location;
}
private static Uri ObtainExecutor(Uri referer, Uri uri, Cookie cookie)
{
CookieContainer cookieJar = new CookieContainer();
cookieJar.Add(cookie);
HttpClientHandler handler = new HttpClientHandler
{
CookieContainer = cookieJar,
AllowAutoRedirect = false
};
HttpClient client = new HttpClient(handler);
client.DefaultRequestHeaders.Referrer = referer;
client.DefaultRequestHeaders.Host = uri.Host;
HttpResponseMessage response = client.GetAsync(uri).Result;
HttpResponseHeaders headers = response.Headers;
return new Uri(uri, response.Headers.Location);
}
private static Uri ObtainConversor(Uri referer, Uri uri, Cookie cookie)
{
CookieContainer cookieJar = new CookieContainer();
cookieJar.Add(cookie);
HttpClientHandler handler = new HttpClientHandler
{
CookieContainer = cookieJar,
AllowAutoRedirect = false
};
HttpClient client = new HttpClient(handler);
client.DefaultRequestHeaders.Referrer = referer;
client.DefaultRequestHeaders.Host = uri.Host;
HttpResponseMessage response = client.GetAsync(uri).Result;
HttpResponseHeaders headers = response.Headers;
// Figure out why the returned redirection URL is empty.
Uri redirection = headers.Location;
// It should be containing the following value.
redirection = new Uri(
"https://idpproxy.pensionsmyndigheten.se/idp/Authn/SamlSP?conversation=e1s1");
return redirection;
}
}