Pregunta

A continuación se muestran dos fragmentos de código que se utilizan para comprobar si existe una carpeta en una biblioteca de documentos de SharePoint.El método PROPFIND parece funcionar, mientras que el otro método, que utiliza HEAD, genera un 401.

¿Alguien puede decirme por qué?No se distraiga con las credenciales, las configuré igual en ambos ejemplos y funciona bien...

Aquí está el código que funciona:

// 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();

y aquí está el código ofensivo:

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;
}
¿Fue útil?

Solución

Mis dos centavos:

Creo que tiene que ver con la forma en que funciona WebDAV:

  • la primera solicitud siempre se envía de forma anónima, porque WebDAV es un protocolo de "desafío/respuesta". Esa primera solicitud sin encabezados de autenticación es necesaria;la respuesta de WebDAV contiene un nonce para validar la siguiente solicitud, lo que ayuda a evitar, por ejemplo, ataques de repetición.(de la respuesta a esta pregunta, consulte los enlaces en la respuesta para obtener más información).

  • ¿El sitio al que intenta acceder se encuentra en su zona de "Intranet local" en IE?De lo contrario, lo siguiente podría brindarle más información sobre su problema y una posible solución:

Comprender por qué sucede

Cuando usa Internet Explorer para acceder al sitio WebDAV, Internet Explorer utiliza Windows HTTP Services (WINHTTP).WinHTTP envía credenciales de usuario solo en respuesta a las solicitudes que ocurren en un sitio de intranet local durante un proceso de inicio de sesión autenticado.Sin embargo, WinHTTP no verifica la configuración de la zona de seguridad en Internet Explorer para determinar si un sitio web es un sitio de intranet local.En cambio, WinHTTP depende de la configuración de proxy en Internet Explorer para determinar si un sitio web es un sitio de intranet local.

Si la opción de configuración de detección automáticamente no está habilitada, no se procesará cualquier script de configuración automática que se define.WinHTTP no identificará el sitio WebDav como un sitio de intranet local.Por lo tanto, WinHTTP enviará una solicitud sin credenciales del usuario, y se le solicitará que escriba las credenciales del usuario.

Entonces, como puede ver, este problema solo parece aparecer en un sitio de Extranet y no en un sitio de intranet.Desafortunadamente, muchos de mis clientes administran soluciones geofísicas en todo el país sin ningún poder intermedio.De aquí.

Otros consejos

La solicitud no generó el 401. El 401 llegó desde el servidor. Usted debe buscar en el registros de sucesos de Windows, registro de IIS, y los registros de SharePoint en el servidor, para ver por qué el servidor devuelve un 401.

Creo que la respuesta es realmente válida, y 401 está bien aquí. Mira, 401 significa "no autorizado". Por lo tanto, cuando se intenta acceder a un recurso, SharePoint primero comprueba sus credenciales para ver si se le permite hacerlo. Si no tiene acceso, devolverá 401, si lo hace, se volverá más de 200 contenidos de lo que ha pedido.

Ahora, ¿cuál es la diferencia entre los dos:

  • cuando está solicitando para el recurso no tiene acceso a
  • cuando está solicitando para el recurso que no existe

El principio básico en SharePoint es - si usted no tiene acceso a una cosa, que no existe para usted y usted no debe saber si existe o no.

Si SharePoint permitió que la cabeza de un recurso que no tiene acceso a, usted podría tratar de buscar http://sharepointsite/docs/JL_Gets_A_Salary_bonus.doc para ver si tiene un bono salarial o no.

Esta es la razón por la que recibe un "acceso denegado" tanto en los recursos que no tienen acceso a los recursos y en la que no existen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top