WebView снова отображает экран входа в систему после входа в систему с помощью базовой аутентификации с помощью HttpClient

я подключаюсь к серверу с базовой аутентификацией, и после этого я вызываю URL-адрес в Webview со следующим кодом:

WebView.Source(new Uri("https:(//UrlHere"));  

Webview выводит окно входа в систему, но я уже вошел в систему. Почему это происходит? Как я могу предотвратить это?

Способ аутентификации на сервере:

   private async void HttpClientCall(object sender, RoutedEventArgs e)
{

    System.Diagnostics.Debug.WriteLine(this.GetType().Name + ": HTTPCLientCall entered");

    //System.Diagnostics.Debug.WriteLine("NetworkConnectivityLevel.InternetAccess: " + NetworkConnectivityLevel.InternetAccess);

    //use this, for checking the network connectivity
    System.Diagnostics.Debug.WriteLine("GetIsNetworkAvailable: " + System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable());

    //var msg = new Windows.UI.Popups.MessageDialog("GetIsNetworkAvailable: " + System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable());
    //msg.ShowAsync();


    HttpClient httpClient = new HttpClient();


    // Assign the authentication headers
    httpClient.DefaultRequestHeaders.Authorization = CreateBasicHeader("username", "password");
    System.Diagnostics.Debug.WriteLine("httpClient.DefaultRequestHeaders.Authorization: " + httpClient.DefaultRequestHeaders.Authorization);


    // Call out to the site
    HttpResponseMessage response = await httpClient.GetAsync("https://URLHere");
    System.Diagnostics.Debug.WriteLine("response: " + response);
    string responseAsString = await response.Content.ReadAsStringAsync();
    System.Diagnostics.Debug.WriteLine("response string:" + responseAsString);

    //WebViewP.Source = new Uri("https://URLHere");
}




public AuthenticationHeaderValue CreateBasicHeader(string username, string password)
{
    byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(username + ":" + password);

    String logindata = (username + ":" + password);
    System.Diagnostics.Debug.WriteLine("AuthenticationHeaderValue: " + new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)));

    return new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
}

Итак, как я могу это решить?


person brush51    schedule 28.10.2013    source источник
comment
Возможно, сервер устанавливает некоторые файлы cookie для аутентификации. Используйте fiddler и найдите заголовок set-cookies в ответе сервера. Если это так, вы можете очистить контейнер cookie, чтобы предотвратить вход в систему.   -  person Darrel Miller    schedule 28.10.2013
comment
я не хочу препятствовать входу в систему. я хочу оставаться в системе. Когда httpClient завершается с авторизацией, я хочу перемещаться/отображать страницу. если сервер устанавливает куки, что мне делать? сохранить файл cookie, а затем снова вызвать страницу? или есть другой способ авторизоваться при звонке в webView?   -  person brush51    schedule 29.10.2013


Ответы (1)


Это долгий путь, но вы можете попробовать установить учетные данные в HttpClientHandler и надеяться, что WebView их подберет.

var handler = new HttpClientHandler();
handler.Credentials = new NetworkCredential(username,password);
HttpClient httpClient = new HttpClient(handler);

Проблема в том, что WebView делает свой собственный независимый запрос, поэтому любые запросы, которые вы делаете с помощью HttpClient, не зависят от запросов, сделанных WebView.

person Darrel Miller    schedule 29.10.2013
comment
Добрый день, сэр, я новичок в C#, у меня есть несколько вопросов по вашему ответу, и я, конечно, надеюсь, что вы уделите минутку, чтобы ответить на них. Во-первых, начиная с UWP существует 2 класса HttpClient, один из пространства имен System, а другой из Windows, какой из них вы имели в виду в своем фрагменте кода? Во-вторых, при каких обстоятельствах любой WebView выберет этот HttpClient? Насколько я могу судить, вы просто инициализируете HttpClient без упоминания WebView в коде. - person Hendra Anggrian; 15.08.2016