首页 > 解决方案 > InteractiveBrowserCredential 有时不显示弹出窗口

问题描述

我有一个 WPF 应用程序,它使用与 Azure 存储 blob 的连接。它适用于连接字符串,但我想通过 Active Directory(带有登录窗口)访问 blob。最好的解决方案似乎使用InteractiveBrowserCredential,但我这里有一个问题 - 有时会显示弹出窗口并且我已通过身份验证并且可以成功获取 blob,但有时未显示浏览器弹出窗口并且应用程序挂起......没有错误被抛出。

我正在使用这样的 InteractiveBrowserCredential:

var blobContainerClient = new BlobContainerClient(new Uri(...)), new InteractiveBrowserCredential());

然后通过前缀获取 blob:

 var blobs = blobContainerClient.GetBlobs(prefix: prefix);
 var files = blobs.Select(b => ...);
 IEnumerable<string> res = files.AsParallel().Select(b => ...).ToArray(); //program hangs here
 return res;

而且程序有时不会继续。

但是,如果我打电话,例如:

blobContainerClient.Exists()

程序总是挂起并且从不执​​行......(仍然有任何错误......)

我发现了一个报告的错误https://github.com/Azure/azure-sdk-for-net/issues/10083,这里用这种方法描述死锁,因为有一个异步实现的同步版本:

public override AccessToken GetToken(TokenRequestContext requestContext, CancellationToken cancellationToken = default)
        {
            return GetTokenImplAsync(requestContext, cancellationToken).GetAwaiter().GetResult();
        }

GetTokenImplAsync(requestContext, cancelToken) 返回 ValueTask 并且他们可能会在不完整的任务上调用 .GetAwaiter().GetResult() 。这可能是我遇到的问题吗?如果是这样,如何解决?

标签: .netwpfazureauthenticationazure-storage

解决方案


DisableAutomaticAuthentication=true,我认为它总是需要用户登录。

Java SDK 文档:

Java SDK

尝试使用下面的代码

var options = new InteractiveBrowserCredentialOptions()
{
    DisableAutomaticAuthentication = true
};
InteractiveBrowserCredential credential = new InteractiveBrowserCredential(options);

推荐阅读