c# sharepoint oauth office365 access-token

c# - Autenticando el sitio Sharepoint desde el servicio en segundo plano y cargando el archivo



oauth office365 (1)

El mejor enfoque sería usar el Modelo de Objetos Lateral de Cliente de SharePoint (como se sugiere hbulens en los comentarios). Aquí está el código que carga el archivo a la biblioteca en O365 (simplemente reemplace los literales de cadena con sus propios detalles):

string username = "YOUR_USERNAME"; string password = "YOUR_PASSWORD"; string siteUrl = "https://XXX.sharepoint.com"; ClientContext context = new ClientContext(siteUrl); SecureString pass = new SecureString(); foreach (char c in password.ToCharArray()) pass.AppendChar(c); context.Credentials = new SharePointOnlineCredentials(username, pass); Site site = context.Site; context.Load(site); context.ExecuteQuery(); Web web = site.OpenWeb("YOUR_SUBSITE"); context.Load(web); context.ExecuteQuery(); List docLib = web.Lists.GetByTitle("YOUR_LIBRARY"); context.Load(docLib); FileCreationInformation newFile = new FileCreationInformation(); string filePath = @"YOUR_LOCAL_FILE"; newFile.Content = System.IO.File.ReadAllBytes(filePath); newFile.Url = System.IO.Path.GetFileName(filePath); Microsoft.SharePoint.Client.File uploadFile = docLib.RootFolder.Files.Add(newFile); context.Load(uploadFile); context.ExecuteQuery();

Puede ejecutarlo en la aplicación de la consola. Dos archivos DLL a los que debes hacer referencia son:

  • Microsoft.SharePoint.Client.dll
  • Microsoft.SharePoint.Client.Runtime.dll

Intento autenticarme contra Sharepoint para poder subir archivos a un sitio Sharepoint específico.

Intento usar un certificado X.509 para recuperar el token de acceso, pero sigo recibiendo (401): No autorizado.

Así es como trato de recuperar el token de acceso con el certificado:

string authority = SettingsHelper.Authority; string clientID = SettingsHelper.ClientId; string serverName = SettingsHelper.SharepointServerName; //Retreive the certificate path string certFile = Server.MapPath(SettingsHelper.CertificatePath); string certPassword = SettingsHelper.CertificatePassword; AuthenticationResult authenticationResult = null; AuthenticationContext authenticationContext = new AuthenticationContext(authority); //Create the certificate file, using the path (certFile), password (certPassword) and the MachineKeySet X509Certificate2 cert = new X509Certificate2(certFile, certPassword, X509KeyStorageFlags.MachineKeySet); //Create the ClientAssertionCertificate using the clientID and the actual certificate ClientAssertionCertificate cac = new ClientAssertionCertificate(clientID, cert); //Retreive the access token using the serverName and client assertion authenticationResult = authenticationContext.AcquireToken(serverName, cac);

Y así es como trato de cargar un archivo específico en una lista específica de Sharepoint:

WebRequest request = null; HttpWebResponse response = null; byte[] bytesToUpload = bytes; var returnValue = ""; string requestUriString = string.Format("{0}/_api/web/GetFolderByServerRelativeUrl(@sru)/Files/Add(url=@fn,overwrite=true)?@sru=''{1}''&@fn=''{2}''", url, HttpUtility.UrlEncode(serverRelativeUrl), HttpUtility.UrlEncode(fileName)); request = (HttpWebRequest)HttpWebRequest.Create(requestUriString); request.Method = "POST"; (request as HttpWebRequest).Accept = "*/*"; request.ContentType = "application/json;odata=verbose"; request.Headers.Add("Authorization", String.Format("Bearer {0}", authenticationResult.AccessToken)); request.ContentLength = bytesToUpload.Length; // Write the local file to the remote system using (Stream requestStream = request.GetRequestStream()) { BinaryWriter writer = new BinaryWriter(requestStream); writer.Write(bytesToUpload, 0, bytesToUpload.Length); writer.Close(); } // Get a web response back response = (HttpWebResponse)request.GetResponse(); using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default)) { returnValue = sr.ReadToEnd(); sr.Close(); } if (request.RequestUri.ToString().Contains("GetFolderByServerRelativeUrl") == true) { returnValue = ""; }

Algunas de las variables provienen de los parámetros:

UploadEmail(System.IO.File.ReadAllBytes(emlFilePath), "https://(blablabla).sharepoint.com", "sites/(bla)/(bla)/Emails", email.Subject + ".msg");

No estoy seguro de qué pasa, y definitivamente no estoy seguro de cómo solucionarlo.

NOTA: Por favor, no me diga que use NetworkCredentials , prefiero usar el certificado u otra cosa, pero no NetworkCredentials

EDITAR

Logré depurar el código y encontrarlo en el encabezado de respuesta de WebRequest :