У меня возникла проблема, когда приложение пытается получить доступ к ресурсам с того же сервера с использованием разных методов проверки подлинности, два метода:
- Учетные данные (NTLM, Basic и т.д.)
- OAuth (Bearer)
Настройка HttpBaseProtocolFilter
HttpBaseProtocolFilter
настроен на:
- отключить кеширование
- отключить автоматический запрос учетных данных пользовательского интерфейса
код
HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();
filter.CacheControl.WriteBehavior = HttpCacheWriteBehavior.NoCache;
filter.CacheControl.ReadBehavior = HttpCacheReadBehavior.MostRecent;
filter.AllowUI = false;
Добавление учетных данных сервера
Если ресурс нуждается в учетных данных, я использую:
filter.ServerCredential = new PasswordCredential(
RequestUri.ToString(),
UserName,
Password);
HttpClient httpClient = new HttpClient(filter);
Добавление токена OAuth
Если ресурсу нужен токен-носитель, я использую:
HttpClient httpClient = new HttpClient(filter);
httpClient.DefaultRequestHeaders.Authorization = new HttpCredentialsHeaderValue("Bearer", token);
ServerCredential
имеют значение null
filter.ServerCredential = null
Получение ответа от сервера
using(httpClient)
{
using(HttpRequestMessage requestMessage = new HttpRequestMessage(new HttpMethod(method), RequestUri))
{
using(HttpResponseMessage response = await httpClient.SendRequestAsync(requestMessage))
{
// Do something with response
}
}
}
Проблема
Если запрос HttpClient
возвращает 200 (OK) с помощью ServerCredential
, то каждый следующий запрос Bearer
также возвращает 200 (OK), даже если токен Bearer
недействителен, а filter.ServerCredential
- null.
Похоже, что filter.ServerCredential
кэшируется, и все последующие вызовы аутентифицируются с кэшированными учетными данными.
Мне нужно перезапустить приложение, если я хочу выполнить проверку Bearer
.
Как удалить, отключить или очистить ServerCredential
для Windows.Web.Http.HttpClient?
Вещи, которые я пробовал:
Удаление всех файлов cookie
var cookieManager = filter.CookieManager;
HttpCookieCollection myCookieJar = cookieManager.GetCookies(RequestUri);
foreach (HttpCookie cookie in myCookieJar)
{
cookieManager.DeleteCookie(cookie);
}
myCookieJar
пуст.
Что-то с PasswordCredentialPropertyStore
Windows.Security.Credentials.PasswordCredentialPropertyStore credentialPropertyStore = new Windows.Security.Credentials.PasswordCredentialPropertyStore();
credentialPropertyStore
пуст.
и
PasswordCredentialPropertyStore
метод Clear зарезервирован для внутреннего использования и не предназначен для использования в вашем коде.
Любые идеи?