ADAL.Net TokenCache 抛出服务器超时错误,错误代码为 500

ADAL.Net TokenCache throwing server timeout error with 500 error code

我正在尝试使用 OWIN 将 WS-Federation 集成到我的 Asp.Net MVC 应用程序中。我遵循了 github 示例,它按预期工作。

现在我想更进一步,从我的网站调用托管在不同 Azure Web 应用程序上的外部 WebApi。对于这种情况,我找不到任何 WS-Fed 示例。 WebApi 需要一个访问令牌来提供对受保护资源的访问。在我的一个 MVC 控制器中,我尝试使用 ADAL.Net 代码来获取访问令牌,但出现超时错误。

string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;    
var authContext1 = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(authority, new NaiveSessionCache(userObjectID));
    var credential = new Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential(clientId, appKey);
    var tokenResult = await authContext1.AcquireTokenAsync(todoListResourceId, credential);

我从 github 上的 Azure samples 之一复制了 NaiveSessionCache。 然后我使用 HttpClient 将此 tokenResult.AccessToken 传递给 webApi 调用。这给了我 500 个服务器超时错误。

但是,如果我不在 authContext1 中使用 NaiveSessionCache 并在其构造函数中将其替换为 false(无缓存),代码工作正常。

我在这里错过了什么?谢谢!

问题似乎与特定版本的 ADAL 有关。我能够使用最新版本的 ADAL (3.13.8) 重现此问题。您开发的 ADAL 是什么版本?

然而,当我将 ADAL 降级到版本 3.9.304210845(从 code sample 使用 NaiveSessionCache class)时,代码对我来说效果很好。

您可以按照以下步骤参考此特定版本:

  1. 替换项目文件中引用ADAL(*.csproj)的版本

 <Reference Include="Microsoft.IdentityModel.Clients.ActiveDirectory, Version=3.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.9.304210845\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Microsoft.IdentityModel.Clients.ActiveDirectory.Platform, Version=3.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.9.304210845\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll</HintPath>
      <Private>True</Private>
    </Reference>
  1. 替换 package.config
  2. 中有关 ADAL 的版本信息

<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.9.304210845" targetFramework="net45" />
  1. 删除 packages 文件夹

  2. 重建解决方案以恢复 3.9.304210845 版本 ADAL

请告诉我它是否适合你。为了解决这个问题,我建议你从 here.

重新打开一个新问题

更新

经查,高版本ADAL使用Task.ConfigureAwait(false)获取token,会破坏线程原有上下文。那么我们在使用ADAL获取token之后就无法访问到用来存储token的HttpContext.Current.Session了。