【问题标题】:401 System.UnauthorizedAccessException when access Dropbox With SharpBox API使用 SharpBox API 访问 Dropbox 时出现 401 System.UnauthorizedAccessException
【发布时间】:2015-03-29 22:15:24
【问题描述】:

代码

config = CloudStorage.GetCloudConfigurationEasy(nSupportedCloudConfigurations.DropBox) 
    as DropBoxConfiguration;
//config.AuthorizationCallBack = new Uri("http://localhost:61926/DBoxDemo.aspx");

requestToken = DropBoxStorageProviderTools.GetDropBoxRequestToken(config, "KEY", "SECRET");
//Session["requestToken"] = requestToken;

string AuthoriationUrl = DropBoxStorageProviderTools.GetDropBoxAuthorizationUrl(
    config, requestToken);
Process.Start(AuthoriationUrl);
accessToken = DropBoxStorageProviderTools.ExchangeDropBoxRequestTokenIntoAccessToken(
    config, "xxxxxxxxxxxxx", "xxxxxxxxxxxxx", requestToken);

CloudStorage dropBoxStorage = new CloudStorage();

var storageToken = dropBoxStorage.Open(config, accessToken);
var publicFolder = dropBoxStorage.GetFolder("/");

// upload a testfile from temp directory into public folder of DropBox
String srcFile = Environment.ExpandEnvironmentVariables(@"C:\Test\MyTestFile.txt");
var rep = dropBoxStorage.UploadFile(srcFile, publicFolder);
MessageBox.Show("Uploaded Successfully..");

**dropBoxStorage.DownloadFile("/MyTestFile.txt",
Environment.ExpandEnvironmentVariables("D:\\test"));**

MessageBox.Show("Downloaded Successfully..");
dropBoxStorage.Close();

这是 Visual Studio 中显示的错误。

【问题讨论】:

  • 当我尝试下载它给我错误上传工作正常请帮助
  • 相同的代码在控制台应用程序中运行良好,但是当我尝试将其放入 Web 窗体或窗口窗体时,它会在下载时出现错误未经授权的访问。
  • 如果上传有效,这意味着访问令牌有效,但下载无效,这听起来像是签署下载调用的问题。我相信 SharpBox 默认使用 HMAC-SHA1 签名。我建议将其更改为 PLAINTEXT。 (不幸的是,我对使用 SharpBox 不是很熟悉,所以我不知道具体该怎么做。)
  • 是的,问题解决了。实际上 SharpBox 只适用于 .net 框架 4.0,所以以前它是 4.5。所以我把它改成了 4.0 现在它可以工作了:)

标签: asp.net dropbox sharpbox


【解决方案1】:

SharpBox 有一个仅在 .NET 4.5 中出现的错误,因为 System.Uri 类的行为已从 4.0 更改为 4.5。

DropBoxStorageProviderService.cs 中的方法GetDownloadFileUrlInternal() 生成了不正确的 URL,因为它更改了 %2f 中的斜杠。在 .NET 4.0 中,此 URL 将通过 OAuthUrlGenerator.cs 中的 GenerateSignedUrl() 方法中的 System.Uri 对象正确转换回来。

我已经从这个改变了GetDownloadFileUrlInternal()的方法...

public static String GetDownloadFileUrlInternal(IStorageProviderSession session, ICloudFileSystemEntry entry)
{
    // cast varibales
    DropBoxStorageProviderSession dropBoxSession = session as DropBoxStorageProviderSession;

    // gather information
    String rootToken = GetRootToken(dropBoxSession);
    String dropboxPath = GenericHelper.GetResourcePath(entry);

    // add all information to url;
    String url = GetUrlString(DropBoxUploadDownloadFile, session.ServiceConfiguration) + "/" + rootToken;

    if (dropboxPath.Length > 0 && dropboxPath[0] != '/')
        url += "/";

    url += HttpUtilityEx.UrlEncodeUTF8(dropboxPath);

    return url;
} 

...到这个...

public static String GetDownloadFileUrlInternal(IStorageProviderSession session, ICloudFileSystemEntry entry)
{
    // cast varibales
    DropBoxStorageProviderSession dropBoxSession = session as DropBoxStorageProviderSession;

    // gather information
    String rootToken = GetRootToken(dropBoxSession);

    // add all information to url;
    String url = GetUrlString(DropBoxUploadDownloadFile, session.ServiceConfiguration) + "/" + rootToken;

    ICloudFileSystemEntry parent = entry.Parent;
    String dropboxPath = HttpUtilityEx.UrlEncodeUTF8(entry.Name);

    while(parent != null)
    {
        dropboxPath = HttpUtilityEx.UrlEncodeUTF8(parent.Name) + "/" + dropboxPath;
        parent = parent.Parent;
    }

    if (dropboxPath.Length > 0 && dropboxPath[0] != '/')
        url += "/";

    url += dropboxPath;

    return url;
}

目前它适用于 .NET 4.5。它可能存在解决问题的更好方法,但目前没有发现不当行为。

【讨论】:

  • 我们从sharpbox.svn.codeplex.com/svn 下载了源代码,按照您的建议进行了更改,并且成功了。唯一的问题是版本 1.2.0.542 没有分支 - 最新版本是 1.1.0.440 - 你知道在哪里可以找到版本 1.2.0.542 吗?
猜你喜欢
  • 2012-05-12
  • 2019-03-16
  • 2019-08-24
  • 1970-01-01
  • 2015-07-17
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
相关资源
最近更新 更多