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

Azure active directory 如果在UWP中调用authContext.AcquireTokenAsync,则出现Null异常,azure-active-directory,uwp-xaml,adal,Azure Active Directory,Uwp Xaml,Adal,我正在编写一个带有ADAL身份验证的UWP应用程序。UWP应用程序不会有太多的用户交互。因此,我喜欢使用ClientCredtial(),这样应用程序就可以在没有用户登录的情况下工作 如果我在authContext.AcquireTokenAsync()中使用ClientCredential(),我会收到一条非常奇怪的错误消息“System.ArgumentNullException:'值不能为null.” 它在控制台程序()中工作完美,但只工作一次,但在UWP应用程序中首次成功后将失败。我是说

我正在编写一个带有ADAL身份验证的UWP应用程序。UWP应用程序不会有太多的用户交互。因此,我喜欢使用ClientCredtial(),这样应用程序就可以在没有用户登录的情况下工作

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

它在控制台程序()中工作完美,但只工作一次,但在UWP应用程序中首次成功后将失败。我是说从第二次尝试起就不起作用了。 clientCredential=新的clientCredential(clientId,appKey); 结果=等待authContext.AcquireTokenAsync(ResourceId,clientCredential)

但是,该方法(authContext.AcquireTokenAsync)可以很好地处理其他参数,如客户端id等,如下所示。 结果=等待authContext.AcquireTokenSilentAsync(ResourceId,clientId)


UWP是否对authContext.AcquireTokenSilentSync()和ClientCredential(clientid,key)有限制?

我认为UWP的ADAL有一个bug

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

至少,它对我有用

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=新的AuthenticationHeaderValue(“承载者”,令牌)

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