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

时间:2017-01-13 21:57:30

标签: azure azure-web-sites adal ws-federation azure-security

我正在尝试使用OWIN在我的Asp.Net MVC应用程序中集成WS-Federation。我跟着github样本,它按预期工作。

现在我想更进一步,从我的网站内调用托管在不同Azure网络应用上的外部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,则代码可以正常工作。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

     <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. 删除文件夹

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

      3. 请告诉我它是否适合您。要解决此问题,我建议您从here重新打开新问题。

        更新

        在调查之后,高版本的ADAL使用Task.ConfigureAwait(false)获取令牌,这将破坏线程的原始上下文。然后,在使用ADAL获取令牌后,我们无法访问用于存储令牌的HttpContext.Current.Session