API вызова HttpClient не проходит проверку подлинности cookie - PullRequest
0 голосов
/ 27 января 2019

Попытка вызова API из контроллера с использованием HttpClient, и API не распознает пользователя как аутентифицированного и вошедшего в систему. При вызове API из JS у меня нет проблем.Я заметил, что HttpClient отправлял только через HTTP 1.1, и поэтому я обновил до 2.0 настройки флаг DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER, но это не имело никакого значения.Я перепробовал все комбинации свойств HttpClientHandler, включая UseCookies, и запрос никогда не аутентифицировался.

        using (var handler = new HttpClientHandler {UseDefaultCredentials = true})
        {
            using (var httpClient = new HttpClient(handler))
            {
                var response = httpClient.GetStringAsync(new Uri($"https://localhost:64366/api/")).Result;
            }
        }

В будущем перейдет к аутентификации на основе токенов, но сейчас хотел бы понять, почему существует разница между вызовамиAPI из C # против JS.Это все HTTPS на локальном хосте, использующем ядро ​​asp net 2.2.

1 Ответ

0 голосов
/ 28 января 2019

Разница между JS и C # заключается в том, что браузеры автоматически прикрепляют файлы cookie к запросам, и вы должны прикреплять файлы cookie вручную в C #, как указано juunas .

Для получения и использования файла cookie аутентификации вы можете использоватьследующий шаблон

CookieContainer cookies = new CookieContainer(); //this container saves cookies from responses and send them in requests
var handler = new HttpClientHandler
{
    CookieContainer = cookies
};

var client = new HttpClient(handler);

string authUrl = ""; //your auth url
string anyUrl = ""; //any url that requires you to be authenticated

var authContent = new FormUrlEncodedContent(
    new List<KeyValuePair<string, string>> {
        new KeyValuePair<string, string>("login", "log_in"),
        new KeyValuePair<string, string>("password", "pass_word")
        }
    );

//cookies will be set on this request
HttpResponseMessage auth = await client.PostAsync(authUrl, authContent);
auth.EnsureSuccessStatusCode(); //retrieving result is not required but you will know if something goes wrong on authentication

//and here retrieved cookies will be used
string result = await client.GetStringAsync(anyUrl);
...