密码凭据背景传输

本文关键字:传输 背景 密码 | 更新日期: 2023-09-27 18:32:14

我正在创建新的后台传输并添加服务器凭据:

PasswordCredential webdavLogin = new PasswordCredential();
webdavLogin.UserName = ServerSettings.Values["serverUsername"].ToString();
webdavLogin.Password = ServerSettings.Values["serverPassword"].ToString();
uploader.ServerCredential = webdavLogin;

现在的问题是,每次我运行后台传输时,都会引发以下异常:

Exception from HRESULT: 0x80070565
The maximum number of secrets that may be stored in a single system has been exceeded

我搜索了凭据存储,但它是空的,没有存储凭据。我能做什么?

密码凭据背景传输

我遇到了完全相同的问题。BackgroundTransfer显然将它们添加到PasswordVault本身中。 您可以尝试不创建PasswordCredential的新实例,但确保它位于PasswordVault中(如果不存在则添加)并检索它。 这可能会阻止后台传输多次添加它。 您仍然需要注意手机上可以存储的最大凭据数...我想到了像161这样的奇怪数字,但我不确定。

或者,我所做的是,因为我只需要基本的身份验证,所以自己创建具有身份验证详细信息的请求标头(BackgroundUploader 的实例有一个您可以使用的方法 SetRequestHeader)。

    var uploader = new BackgroundUploader
    {
        //ServerCredential = new PasswordCredential {UserName = uploadUser.Name, Password= uploadUser.Password}
    };
    var authHeader = Headers.GetAuthorizationHeader(uploadUser.Name, uploadUser.Password);
    uploader.SetRequestHeader(authHeader.Key,authHeader.Value);
    KeyValuePair<string, string> GetAuthorizationHeader(string username, string password)
    {
        return new KeyValuePair<string, string>(Authorization, "Basic " + EncodeToBase64(string.Format("{0}:{1}", username, password)));
    }
    string EncodeToBase64(string toEncode)
    {
        var bytes = Encoding.UTF8.GetBytes(toEncode);
        var returnValue = Convert.ToBase64String(bytes);
        return returnValue;
    }

鉴于我的方案,这比通过密码保险箱管理凭据更容易

您只能有 20 个具有凭据的未完成操作。

如果您认为当时没有运行任何操作,则缓存中可能有 10 个被遗忘或损坏的操作。 AttachAsync()所有这些并立即取消它们。

下面是一个示例:

private async Task CancelAll()
{
    // Get all running operations.
    var downloads = await BackgroundDownloader.GetCurrentDownloadsAsync();
    Debug.WriteLine(downloads.Count);
    var cancellationTokenSource = new CancellationTokenSource();
    List<Task> tasks = new List<Task>();
    foreach (var download in downloads)
    {
        var task = download.AttachAsync().AsTask(cancellationTokenSource.Token);
        tasks.Add(task);
    }
    try
    {
        // Cancel all the operations. It is expected they will throw exception.
        cancellationTokenSource.Cancel();
        Task.WaitAll(tasks.ToArray());
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);
    }
    Debug.WriteLine("All canceled!");
}

然后,使用 DownloadOperation.StartAsyn() 安排新操作。