Не удается подключиться к веб-службе TLS с использованием C# и дайджест-аутентификации, Firefox преуспевает там, где IE8 терпит неудачу

Я пытаюсь подключиться к веб-службе с помощью С# и дайджест-аутентификации, но каждый раз получаю ошибку 401 - Not Authorized. Но когда я пытаюсь подключиться к сервису через Firefox, все в порядке. Когда я использую IE8, мой пароль не принимается, и я получаю 401.

У тебя есть идеи? Спасибо за помощь.

Вот тестовый код, который я использую:

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
    ServicePointManager.ServerCertificateValidationCallback 
        = delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

    Uri uri = new Uri(URL);

    NetworkCredential netCredential = new NetworkCredential(username, password);
    CredentialCache cache = new CredentialCache();
    cache.Add(URL, 443, "Digest", netCredential);

    WebRequest request = WebRequest.Create(URL);
    request.Credentials = cache;
    request.PreAuthenticate = true;
    request.Method = "POST";

    WebResponse response;

    try
    {
        response = request.GetResponse();
        Stream stream = response.GetResponseStream();
        StreamReader reader = new StreamReader(stream);
        string result = reader.ReadToEnd();
        Response.Write(result);
        response.Close();
        reader.Close();
    }
    catch (Exception ex)
    {
        Response.Write("Error: " + ex.Message + "<br/><br/><br/>");
        Response.Write("Request Headers<br/><br/>");

        WebHeaderCollection headers = request.Headers;

        // Get each header and display each value.
        foreach (string key in headers.AllKeys)
        {
            string value = headers[key];
            Response.Write(key + ": " + value);

            Response.Write("<br/><br/>");
        }

    }

person emrekyv    schedule 29.01.2010    source источник


Ответы (1)


Вы используете неправильную перегрузку CredentialCache.Add, вам следует использовать CredentialCache.Add(Uri, string, NetworkCredential) вместо этого. Первый (с номером порта) предназначен только для SMTP.

cache.Add(uri, "Digest", netCredential);
person Pent Ploompuu    schedule 29.01.2010
comment
Я исправил это, но все еще получил ошибку. Удаленный сервер вернул ошибку: (401) Несанкционировано. Я уверен, что пароль правильный (Firefox работает), может быть, это проблема с сертификатом? - person emrekyv; 29.01.2010
comment
Возможно, вам нужно добавить домен также в класс NetworkCredential (если вы вводите имя пользователя как домен\имя пользователя в firefox). - person Pent Ploompuu; 29.01.2010
comment
Я также не использую домен в Firefox, только имя пользователя и пароль. - person emrekyv; 29.01.2010
comment
Вы можете попробовать указать учетные данные непосредственно в запросе: request.Credentials = netCredential; request.PreAuthenticate = false;. - person Pent Ploompuu; 29.01.2010