C#登录并上传到OneDrive而无需用户交互

The*_*ico 17 c# windows-services login file-upload onedrive

我目前正在开发一种Windows服务,它将检查和更新Excel文件并将其上传到选定的云存储 - SharePoint或OneDrive.整个过程应该是全自动的,无需任何用户交互 - 所有必需的信息(用户名,密码等)都是配置文件的一部分.

除OneDrive部分外,一切顺利.我无法找到登录并上传到此云存储的全自动解决方案.我知道Microsoft Live SDK,但是它对非WinPhone和-WinStore应用程序的支持减少了,据我所知,它总是要求用户输入用户名,密码(webbrowser组件).

第二个选项是SkyDriveClientAPI(此处链接),但此API不再起作用(如问题中所述).

有没有办法在没有用户交互的情况下使用Live SDK,或者您是否有其他方式的其他建议?

Cur*_*Guy 5

这是部分可以实现的

正如其他答案中提到的,一个驱动器需要用户身份验证,这使得全自动解决方案变得不可能。

然而,一个几乎自动的解决方案是可能的,这意味着可以创建一个应用程序,它需要一次登录(第一次激活)和登录后,用户对正在运行的应用程序的授权,从那时起,应用程序将能够自动工作(上传、下载、创建文件夹、直接链接到上传的文件等......),即使应用程序关闭并重新启动机器,这也将继续工作。

从一个驱动器连接中脱离应用程序的唯一方法是注销应用程序(可以自动实现)。

这可以通过使用 LIVE sdk(桌面)并遵循单点登录指南来实现,您很可能需要访问以下范围:

  • wl.basic
  • 登录
  • wl.skydrive_update
  • wl.offline_access

检查一个驱动器开发中心:

为了实现这种行为,我建议按照以下步骤操作:

使用示例构建一个基本的演示应用程序后:

  • 增强您的应用程序以使用单点登录功能,
  • 增强您的应用程序以刷新其身份验证令牌(因此会话不会超时等)


Neh*_*rai 5

迟了两年回答,但我认为这对以后的使用会有帮助。

注册应用程序后,您无需弹出窗口即可获取访问令牌,请参阅这篇文章使用 OAuth REST API 获取 Microsoft Graph 的访问令牌。如何获取token(一个postman的例子),我根据这个postman的例子写了下面的代码:

一个用于在不弹出窗口的情况下获取令牌的 C# 示例:

public async Task GetTokenAsync(string tenant, string clientId, string clientSecret, string username, string password)
{
    HttpResponseMessage resp;
    using (var httpClient = new HttpClient())
    {
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
        var req = new HttpRequestMessage(HttpMethod.Post, $"https://login.microsoftonline.com/{tenant}/oauth2/token/");
         req.Content = new FormUrlEncodedContent(new Dictionary<string, string>
         {
            {"grant_type", "password"},
            {"client_id", clientId},
            {"client_secret", clientSecret},
            {"resource", "https://graph.microsoft.com"},
            {"username", username},
            {"password", password}
         });

         resp = await httpClient.SendAsync(req);
         string content = await resp.Content.ReadAsStringAsync();
         var jsonObj = new JavaScriptSerializer().Deserialize<dynamic>(content);               
         string token = jsonObj["access_token"];                
         Console.WriteLine(token);
    }
}
Run Code Online (Sandbox Code Playgroud)

获得令牌后,即可轻松登录。


AKG*_*AKG 2

OneDrive 提供用于上传文件的 API。但其指南的限制之一是所有通过 API 的上传都必须由用户发起或使用接受。因此,您无法以全自动过程将文件上传到 OneDrive。

一种解决方案可能是评论中建议的那样。将文件复制到本地 OneDrive 文件夹,并让 OneDrive 应用程序负责上传。