我正在尝试使用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,则代码可以正常工作。
我在这里缺少什么?谢谢!
答案 0 :(得分:1)
该问题似乎与ADAL的特定版本有关。我可以使用最新版本的ADAL(3.13.8
)重现此问题。您正在开发的ADAL版本是什么?
但是当我将ADAL降级到版本3.9.304210845
时(使用NaiveSessionCache
类从code sample降级),代码对我来说效果很好。
您可以按照以下步骤参考此特定版本:
<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 id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.9.304210845" targetFramework="net45" />
删除包文件夹
重建解决方案以恢复3.9.304210845
版本ADAL
请告诉我它是否适合您。要解决此问题,我建议您从here重新打开新问题。
在调查之后,高版本的ADAL使用Task.ConfigureAwait(false)
获取令牌,这将破坏线程的原始上下文。然后,在使用ADAL获取令牌后,我们无法访问用于存储令牌的HttpContext.Current.Session
。