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)时,代码对我来说效果很好。
您可以按照以下步骤参考此特定版本:
- 替换项目文件中引用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>
- 替换 package.config
中有关 ADAL 的版本信息
<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.9.304210845" targetFramework="net45" />
删除 packages 文件夹
重建解决方案以恢复 3.9.304210845
版本 ADAL
请告诉我它是否适合你。为了解决这个问题,我建议你从 here.
重新打开一个新问题
更新
经查,高版本ADAL使用Task.ConfigureAwait(false)
获取token,会破坏线程原有上下文。那么我们在使用ADAL获取token之后就无法访问到用来存储token的HttpContext.Current.Session
了。
我正在尝试使用 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)时,代码对我来说效果很好。
您可以按照以下步骤参考此特定版本:
- 替换项目文件中引用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>
- 替换 package.config 中有关 ADAL 的版本信息
<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.9.304210845" targetFramework="net45" />
删除 packages 文件夹
重建解决方案以恢复
3.9.304210845
版本 ADAL
请告诉我它是否适合你。为了解决这个问题,我建议你从 here.
重新打开一个新问题更新
经查,高版本ADAL使用Task.ConfigureAwait(false)
获取token,会破坏线程原有上下文。那么我们在使用ADAL获取token之后就无法访问到用来存储token的HttpContext.Current.Session
了。