【问题标题】:Downloading Picture Uploaded to Bot From Sharepoint Returns 403 FORBIDDEN下载从 Sharepoint 上传到 Bot 的图片返回 403 FORBIDDEN
【发布时间】:2019-02-07 18:33:01
【问题描述】:

我正在使用 Bot Framework v4 SDK。我正在尝试将通过机器人上传到 Microsoft Teams 的图片下载到临时目录中,然后使用该图片。我之所以这样做是因为我需要拍摄一张用户附加到聊天中的照片,然后将这张照片放入文档中并将文档返回给用户。这在我在模拟器上运行时有效,但一旦机器人在 Teams 中,我就会收到错误。

我通过 AttachmentPrompt 提示用户输入照片:

return await stepContext.PromptAsync(
    "imagePrompt",
    new PromptOptions
    {
        Prompt = MessageFactory.Text("Please attach a picture."),
    });

从 stepContext.Result 中获取附件:

List<Attachment> contextAttachmentResult = (List<Attachment>)stepContext.Result;

确定文件的托管位置

var remoteFileUrl = contextAttachmentResult[0].ContentUrl;

设置系统临时目录的路径

var tempImagePath = Path.Combine(Path.GetTempPath(), contextAttachmentResult[0].Name);

并尝试使用WebClient下载文件

using (var webClient = new WebClient())
{
    webClient.Headers.Add("User-Agent", "Other");
    webClient.Headers.Add("Authorization", userProfile.Token);
    webClient.DownloadFile(remoteFileUrl, tempImagePath);
}

我尝试将令牌放入我从OAuthPrompt 获得的令牌,但我仍然得到 403。当我尝试下载它时,403 就出现了。我认为这是 SharePoint 问题的原因是因为如果我打印出 remoteFileUrl 我会得到 https://company-my.sharepoint.com/personal/my_name/Documents/Microsoft Teams Chat Files/someImage.png

堆栈跟踪的开头是:

System.Net.WebException: The remote server returned an error: (403) FORBIDDEN. at System.Net.HttpWebRequest.GetResponse() at System.Net.WebClient.GetWebResponse(WebRequest request) at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream) at System.Net.WebClient.DownloadFile(Uri address, String fileName)

编辑: 根据 Mick 的评论,我尝试以这种方式使用 ConnectorClient(并尝试两种不同的下载方式):

using (var connectorClient = new ConnectorClient(new Uri(stepContext.Context.Activity.ServiceUrl, MYAPPID, MYAPPPASSWORD)))
{
    var token = await (connectorClient.Credentials as MicrosoftAppCredentials).GetTokenAsync();
    using (var httpClient = new HttpClient())
    {
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(contextAttachmentResult[0].ContentType));
        var byteArray = await httpClient.GetByteArrayAsync(remoteFileUrl);

    }
    using (var webClient = new WebClient())
    {
        webClient.Headers.Add("User-Agent", "Other");
        webClient.Headers.Add("Authorization", token);
        webClient.DownloadFile(remoteFileUrl, siteReviewFile1ImagePath);
    }
}

但即使我已将连接器设置为使用我的 appId 和 appPwd System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized). at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode() at System.Net.Http.HttpClient.d__30.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at IBIBot.Dialogs.SiteReviewSpace.SiteReviewDialog.&lt;&gt;c__DisplayClass4_0.&lt;&lt;-ctor&gt;b__2&gt;d.MoveNext() in

,我也会收到 401

我仍然对如何下载此文件感到困惑

【问题讨论】:

  • 您使用的是 Bot Framework v3 还是 v4?您需要使用来自 Bot Connector 的访问令牌,而不是使用 OAuth 卡检索的用户的访问令牌。
  • 我使用的是 v4。我根本无法让 Bot Connector 工作,我猜它不适用于 v4。我将编辑我的帖子以包含我正在使用的版本。
  • 我现在正试图让机器人连接器工作。我无法通过 401 Unauthorized。我相信这是因为我的 connectorClient.Credentials 有空值。我会发布更多信息。也许这本身就是一个错误,但更有可能是我做错了什么。

标签: c# .net sharepoint botframework


【解决方案1】:

这可以通过不使用 Attachment.ContentUrl 而是使用 Attachment.Content.DownloadUrl 来解决。 downloadurl 是预授权下载,因此不需要任何承载或授权标头。 我的代码看起来像这样:

var remoteFileUrl = ((JObject)contextAttachmentResult[0].Content)["downloadUrl"].ToString();
using (var webClient = new WebClient())
{
    webClient.DownloadFile(remoteFileUrl, someFileLocationPath);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2018-01-14
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多