Я делаю HttpWebRequest, используя asp. net для получения данных. Мой первый запрос к странице входа выполнен успешно, и я могу пройти проверку подлинности с помощью POST. Однако, когда я пытаюсь перейти на другую страницу, используя те же учетные данные и передавая файлы cookie, я получаю ошибку Unauthorized 401.
Мой код неверен? Я что-то упустил, чтобы заставить это работать на этом сайте?
Мой код:
public static void WebServiceTest()
{
Uri uri = new Uri("https://www.***.com/home/.../#/login");
Uri uriDomain = new Uri("https://www.***.com");
Uri uri2 = new Uri("https://www.***.com/home/api/.../menus");
string username = "*****";
string password = "*****";
NetworkCredential cred = new NetworkCredential(username, password);
CredentialCache cache = new CredentialCache();
cache.Add(uri, "Basic", cred);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.AllowAutoRedirect = true;
request.KeepAlive = true;
request.CookieContainer = new CookieContainer();
//make first response
using (var response = (HttpWebResponse)request.GetResponse())
{
// Print the properties of each cookie for testing
foreach (Cookie cook in response.Cookies)
{
System.Diagnostics.Debug.WriteLine("Cookie:");
System.Diagnostics.Debug.WriteLine($"{cook.Name} = {cook.Value}");
System.Diagnostics.Debug.WriteLine($"Domain: {cook.Domain}");
System.Diagnostics.Debug.WriteLine($"Path: {cook.Path}");
System.Diagnostics.Debug.WriteLine($"Port: {cook.Port}");
System.Diagnostics.Debug.WriteLine($"Secure: {cook.Secure}");
System.Diagnostics.Debug.WriteLine($"When issued: {cook.TimeStamp}");
System.Diagnostics.Debug.WriteLine($"Expires: {cook.Expires} (expired? {cook.Expired})");
System.Diagnostics.Debug.WriteLine($"Don't save: {cook.Discard}");
System.Diagnostics.Debug.WriteLine($"Comment: {cook.Comment}");
System.Diagnostics.Debug.WriteLine($"Uri for comments: {cook.CommentUri}");
System.Diagnostics.Debug.WriteLine($"Version: RFC {(cook.Version == 1 ? 2109 : 2965)}");
// Show the string representation of the cookie.
System.Diagnostics.Debug.WriteLine($"String: {cook}");
}
Stream resStream = response.GetResponseStream();
StreamReader reader = new StreamReader(resStream);
string text = reader.ReadToEnd();
//check response output
System.Diagnostics.Debug.WriteLine(text);
//now setup second request
var request2 = (HttpWebRequest)WebRequest.Create(uri2);
request2.Credentials = cache;
request2.Method = "GET";
request2.ContentType = "text/xml; encoding='utf-8'";
//setup cookie container for new httpwebrequest by
//setting container to first request container
CookieContainer cookieJar = new CookieContainer();
cookieJar = request.CookieContainer;
request2.CookieContainer = cookieJar;
//just in case, add username and password cookies
var userCookie = new Cookie("username", "*****");
var pswdCookie = new Cookie("password", "*****");
request2.CookieContainer.Add(uriDomain, userCookie);
request2.CookieContainer.Add(uriDomain, pswdCookie);
System.Diagnostics.Debug.WriteLine("** LINE BREAK **");
//check what is in the second request cookie container
foreach (Cookie cook in request2.CookieContainer.GetCookies(uriDomain))
{
System.Diagnostics.Debug.WriteLine(cook.Name + ":" + cook.Value);
}
//get second response
using (var response2 = (HttpWebResponse)request2.GetResponse())
{
Stream resStream2 = response2.GetResponseStream();
StreamReader reader2 = new StreamReader(resStream2);
string text2 = reader2.ReadToEnd();
response2.Close();
}
// Close the original response.
response.Close();
}
}
Я также должен сказать, что разработчик сайта сказал мне, что их сайт " извлекает токен только через пользовательский интерфейс, и этот токен используется при последующих вызовах API". Но это не должно помешать мне перескакивать или нет?
Спасибо,