【问题标题】:Null Exception if authContext.AcquireTokenAsync is called in UWP如果在 UWP 中调用 authContext.AcquireTokenAsync,则出现 Null 异常
【发布时间】: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() 有限制?

【问题讨论】:

    标签: azure-active-directory uwp-xaml adal


    【解决方案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);

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多