0

我正在尝试使用 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 上的一个 azure示例中复制了 NaiveSessionCache 。然后我使用 HttpClient 将此 tokenResult.AccessToken 传递给 webApi 调用。这给了我 500 服务器超时错误。

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

我在这里想念什么?谢谢!

4

1 回答 1

1

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

但是,当我将 ADAL 降级到版本时3.9.304210845(从使用类的代码示例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. 删除文件夹

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

请告诉我它是否适合你。为了解决这个问题,我建议你从这里重新打开一个新问题。

更新

经调查,高版本ADAL获取tokenTask.ConfigureAwait(false)会破坏线程原有的上下文。HttpContext.Current.Session然后在使用 ADAL 获取令牌后,我们无法访问用于存储令牌的哪个。

于 2017-01-18T09:12:23.733 回答