【问题标题】:ADAL.Net TokenCache throwing server timeout error with 500 error codeADAL.Net TokenCache 引发服务器超时错误,错误代码为 500
【发布时间】:2017-05-29 09:12:30
【问题描述】:

我正在尝试使用 OWIN 在我的 Asp.Net MVC 应用程序中集成 WS-Federation。我遵循了 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 上的蔚蓝 samples 之一复制了 NaiveSessionCache。 然后我使用 HttpClient 将此 tokenResult.AccessToken 传递给 webApi 调用。这给了我 500 服务器超时错误。

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

我在这里缺少什么?谢谢!

【问题讨论】:

  • 你能成功获取访问令牌吗?您可以使用 Fiddler 捕获请求,检查是否是由于获取令牌或请求 Web API 引起的问题。
  • 不。我删除了 WebAPi 调用代码,只有 AcquireToken 代码,但它失败并出现相同的服务器超时错误。 AuthenticationContext 构造函数有问题。正如我最初提到的,如果我不创建新的 NaiveSessionCache 而只是在构造函数中传递 false ,那么它就像一个魅力并取回访问令牌。

标签: azure azure-web-app-service adal ws-federation azure-security


【解决方案1】:

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

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

您可以通过以下步骤参考此特定版本:

  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 中有关 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了。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2010-11-07
  • 1970-01-01
相关资源
最近更新 更多