如果在 UWP 中调用 authContext.AcquireTokenAsync,则出现 Null 异常

Posted

技术标签:

【中文标题】如果在 UWP 中调用 authContext.AcquireTokenAsync,则出现 Null 异常【英文标题】:Null Exception if authContext.AcquireTokenAsync is called in UWP 【发布时间】:2017-09-26 19:24:03 【问题描述】:

我正在编写一个带有 ADAL 身份验证的 UWP 应用程序。 UWP 应用不会有太多的用户交互。因此,我喜欢使用 ClientCredtial(),然后应用程序无需用户登录即可运行。

如果我在 authContext.AcquireTokenAsync() 中使用 ClientCredential(),我会收到一条非常奇怪的错误消息“System.ArgumentNullException: 'Value cannot be null.'”。

它在控制台程序 (https://github.com/Azure-Samples/active-directory-dotnet-daemon) 中完美运行,但它只能运行一次,但在 UWP 应用程序第一次成功后会失败。我的意思是它在第二次尝试时不起作用。 clientCredential = new ClientCredential(clientId, appKey); 结果 = 等待 authContext.AcquireTokenAsync(ResourceId, clientCredential);

但是,该方法 (authContext.AcquireTokenAsync) 可以与其他参数(例如客户端 ID 等)一起正常工作,如下所示。 结果 = 等待 authContext.AcquireTokenSilentAsync(ResourceId, clientId);

UWP 是否对带有 ClientCredential(clientid, key) 的 authContext.AcquireTokenSilentAsync() 有限制?

【问题讨论】:

【参考方案1】:

我认为 UWP 的 ADAL 存在错误。

但是,有一种解决方法可以避免错误“值不能为空。”。 首先,我检查了令牌缓存是否可用。如果可用,将使用现有令牌。

至少,它对我有用。

TokenCacheItem tItem = authContext.TokenCache.ReadItems().FirstOrDefault();
if (tItem != null) //use the exsting token.
    token = tItem.AccessToken;
else // get a new token if not available.

    result = await authContext.AcquireTokenAsync   (resourceid, clientCredential);
    token = result.AccessToken;

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

在控制台应用程序中,您不需要上述解决方案。它无需检查缓存即可工作。

【讨论】:

以上是关于如果在 UWP 中调用 authContext.AcquireTokenAsync,则出现 Null 异常的主要内容,如果未能解决你的问题,请参考以下文章

自己在UWP程序上调用usb转串口的路程

在UWP中,我们可以使用动态编译和使用C#Reflection的成员调用动态编译和调用UWP中的新页面吗?

UWP webView 相当于 Android 中的 addJavascriptInterface()

如何在win32 C++控制台应用程序中调用uwp类库

如何在WPF中调用Windows 10/11 API(UWP/WinRT)

如何从 UWP 应用程序调用“libheif.dll”函数