Artículo original publicado el jueves, 27 de octubre de 2011

El título de esta entrada de hecho hace que parezca mucho más complicado que la solución final.  Realmente es un caso de combinación de las técnicas que he tratado en dos entradas anteriores:  http://blogs.technet.com/b/speschka/archive/2010/09/25/retrieving-rest-data-in-a-claims-based-auth-site-in-sharepoint-2010.aspx y http://blogs.technet.com/b/speschka/archive/2011/04/01/retrieving-data-from-a-multi-auth-site-using-the-client-om-and-web-services-in-sharepoint-2010.aspx.  La versión abreviada de este escenario es esta: algunos usuarios deseaban hacer algo como un ping de comprobación de estado con un sitio de SharePoint que usaba autenticación SAML.  Anteriormente solo habían estado trabajando con sitios que usaban en la autenticación de Windows, y tan pronto como probaban estas herramientas con un sitio que admitía varios tipos de autenticación - SAML y Windows - dichas herramientas dejaban de funcionar.

El punto de la comprobación de estado es simplemente realizar una comprobación a un sitio y asegurarse de que se devuelven los datos; si, en su lugar, se devuelve algún código de error, pueden empezar a investigarlo a fondo.  He decidido que la mejor manera de hacerlo es simplemente hacer una llamada al listdata.svc que es el extremo REST para el sitio.  Es algo que siempre está ahí, y su configuración para forzarlo mediante NTLM en un sitio de multiautorización es algo que imaginé que sería bastante sencillo, y de hecho lo era.  Lo fundamental del enfoque es simplemente realizar una HttpWebRequest y agregar el encabezado que he descrito en el segundo vínculo anterior para forzarlo a usar NTLM.  El resultado es un fragmento de código bastante sencillo con el siguiente aspecto:

string endpoint = UrlTxt.Text + "/_vti_bin/listdata.svc";
    
//make a request to the REST interface for the data
HttpWebRequest webRqst = (HttpWebRequest)WebRequest.Create(endpoint);
webRqst.UseDefaultCredentials = true;
webRqst.Method = "GET";
webRqst.Accept = "*/*";
webRqst.KeepAlive = true;
webRqst.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");

//read the response now
HttpWebResponse webResp = webRqst.GetResponse() as HttpWebResponse;

//make the request and get the response
StreamReader theData = new StreamReader(webResp.GetResponseStream(), true);
string payload = theData.ReadToEnd();
theData.Close();
webResp.Close();

ResultsTxt.Text = payload;

Por tanto, como puede ver, acabo de crear la solicitud, de configurar algunas propiedades y, a continuación, de agregar mi encabezado que indica a SharePoint que use la autenticación de Windows.  A continuación, solo realizo mi solicitud y estaré listo para empezar.  Es un proyecto bastante sencillo pero he adjunto la solución completa a esta publicación por si resulta de utilidad.

 

Esta entrada de blog es una traducción. Puede consultar el artículo original en Retrieving REST Data Using NTLM From a Dual Auth Site in SharePoint 2010