C# Web Dav, зачем головной запрос сгенерировал 401?

StackOverflow https://stackoverflow.com/questions/2008405

  •  18-09-2019
  •  | 
  •  

Вопрос

Ниже приведены 2 фрагменты кода, используемые для проверки, существует ли папка в библиотеке документов SharePoint. Метод Propfind, по -видимому, работает, в то время как другой метод, использующий головку, приводит к 401.

Кто -нибудь может сказать мне, почему? Не отвлекайтесь на учетные данные, я установил их в обоих примерах, и все работает нормально ....

Вот код, который работает:

// Create the web request object
var oReq = (HttpWebRequest)WebRequest.Create(url);

// Set the needed properties
oReq.Method = "PROPFIND";
oReq.Credentials = this.wsLists.Credentials; // Use same credentials as wsLists. 
oReq.AllowAutoRedirect = true;
oReq.UserAgent = "Microsoft-WebDAV-MiniRedir/6.1.7600";

// Enumerate through top level only, increasing the depth will find children.
oReq.Headers["Depth"] = "0";
oReq.Headers["translate"] = "f";
var oRequest = new StreamWriter(oReq.GetRequestStream());
oRequest.WriteLine();
oRequest.Close();
var oResponse = new StreamReader(oReq.GetResponse().GetResponseStream());
string sResponse = oResponse.ReadToEnd();
oResponse.Close();

А вот код оскорбления:

private bool MossResourceExists(string url)
{
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "HEAD";

    // Create a new CredentialCache object and fill it with the network
    // credentials required to access the server.
    var myCredentialCache = new CredentialCache();
    if (!string.IsNullOrEmpty(this.Domain ))
    {
        myCredentialCache.Add(new Uri(url),
       "NTLM",
       new NetworkCredential(this.Username , this.Password , this.Domain )
       );
    }
    else
    {
        myCredentialCache.Add(new Uri(url),
       "NTLM",
       new NetworkCredential(this.Username , this.Password )
       );
    }

    request.Credentials = myCredentialCache;

    try
    {
        request.GetResponse();
        return true;
    }
    catch (WebException ex)
    {
        var errorResponse = ex.Response as HttpWebResponse;

        if (errorResponse != null)
            if (errorResponse.StatusCode == HttpStatusCode.NotFound)
                return false;
            else
                throw new Exception("Error checking if URL exists:" + url + ";Status Code:" + errorResponse.StatusCode + ";Error Message:" + ex.Message ) ;
    }
    return true;
}
Это было полезно?

Решение

Мои два цента:

Я думаю, что это связано с тем, как работает WebDav:

  • Первый запрос всегда отправляется анонимным, потому что WebDav является протоколом «вызов / ответа», этот первый запрос без заголовков авторов необходим; Ответ от WebDAV содержит Nonce для проверки следующего запроса, помогая отклонить, например, атаки воспроизведения. (от ответа на этот вопрос, см. Ссылки в ответе для получения дополнительной информации).

  • Сайт, к которому вы пытаетесь получить доступ в своей зоне "местной интрасети" в IE? Если нет, то следующее может дать больше информации о вашей проблеме и возможном Woraround:

Понимание, почему это происходит

Когда вы используете Internet Explorer для доступа к сайту WebDAV, Internet Explorer использует Windows HTTP Services (WINHTTP). Winhttp отправляет учетные данные пользователя только в ответ на запросы, которые встречаются на локальном интрасети -сайте во время аутентифицированного процесса входа в систему. Тем не менее, Winhttp не проверяет настройки зоны безопасности в Internet Explorer, чтобы определить, является ли веб -сайт локальным интранет -сайтом. Вместо этого Winhttp зависит от настройки прокси в Internet Explorer, чтобы определить, является ли веб -сайт локальным интрасетиным сайтом.

Если параметр «Настройки автоматического обнаружения» не включена, любой определенный сценарий автоматической конфигурации не будет обработан. Winhttp не будет идентифицировать сайт WebDav как местный сайт Intranet. Поэтому Winhttp отправит запрос без учетных данных пользователя, и вам будет предложено ввести учетные данные пользователя.

Таким образом, как вы можете видеть, эта проблема, кажется, появляется только на сайте Extranet, а не на сайте интранета. К сожалению, многие из моих клиентов управляют геофизическими решениями по всей стране, и между ними нет прокси. Из здесь.

Другие советы

Запрос не генерировал 401. 401 поступил с сервера. Вы должны посмотреть на журналы событий Windows, журнал IIS и журналы SharePoint на сервере, чтобы понять, почему сервер вернул 401.

Я думаю, что ответ на самом деле действителен, и 401 здесь в порядке. Смотри, 401 означает «несанкционированный». Таким образом, когда вы пытаетесь получить доступ к ресурсу, SharePoint сначала проверяет ваши учетные данные, чтобы увидеть, разрешено ли вам это сделать. Если у вас нет доступа, он вернет 401, если вы это сделаете, он вернет 200+ содержимого того, что вы просили.

Теперь, в чем разница между ними:

  • Когда вы просите ресурса, у вас нет доступа к
  • Когда вы просите ресурса, которого не существует

Основной принцип в SharePoint - если у вас нет доступа к вещам, он не существует для вас, и вы не должны знать, существует ли он или нет.

Если SharePoint позволил вам отправиться в ресурс, к которому у вас нет доступа, вы можете попытаться найти http://sharepointsite/docs/JL_Gets_A_Salary_bonus.doc Чтобы увидеть, есть ли у вас бонус зарплаты или нет.

Вот почему вы получаете «отрицательный доступ» как к ресурсам, к которым у вас нет доступа, так и на ресурсах, которые не существуют.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top