一小时后,身份从持有人令牌中消失

我正在使用Azure AD与Web应用程序和Web API建立多租户解决方案。 Web应用程序使用OpenIdConnect来检索承载令牌(在Azure Redis缓存中缓存),该令牌在Angular中用于从Web api获取JSON。 在Web应用程序和Web API(在Azure AD应用程序中设置)之间使用用户模拟。

问题:

这可以正常工作大约一个小时,然后身份突然消失在web api端。 如果我刷新Web应用程序,我会看到该页面被重定向到Microsoft登录页面,但不需要执行任何操作,因为用户只是重定向回Web应用程序并且一切都有效。 据我所知,Web应用程序在失败时使用相同的承载令牌,在再次运行时刷新(相同的过期时间)。 AuthenticationContext.AcquireTokenSilent适用于这两种情况。

我试图增加很多不同的超时,但没有任何帮助。 我还在web api上禁用了除持有者令牌身份validation之外的所有身份validation。 我不明白为什么身份会消失,为什么它有助于刷新客户。 有任何想法吗? 🙂

附加信息

这是RequestContext.Principal.Identity在登录或刷新后大约一小时查找的内容(在web api上):

在此处输入图像描述

这是大约一个小时后,导致身份validation失败:

在此处输入图像描述

我尝试过的一些代码更改:

在web api HttpConfiguration中:

config.SuppressDefaultHostAuthentication(); config.Filters.Add( new HostAuthenticationFilter( new WindowsAzureActiveDirectoryBearerAuthenticationOptions().AuthenticationType)); 

这将未经身份validation的主体从WindowsPrincipal更改为ClaimsPrincipal,但在一小时后仍然失败。

 WindowsAzureActiveDirectoryBearerAuthenticationOptions BackChannelTimeout set to 5 days. Still fails 

在Web应用程序web.config中:

 sessionState timeout="525600" for RedisSessionStateProvider. Still fails 

在web应用程序owin auth进程中,增加了时间跨度并增加了滑动到期时间。 仍然失败:

 app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); app.UseCookieAuthentication(new CookieAuthenticationOptions { CookieSecure = CookieSecureOption.Always, ExpireTimeSpan = TimeSpan.FromDays(5), SlidingExpiration = true, CookieHttpOnly = true }); app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { ClientId = ClientId, Authority = Constants.CommonAuthority, UseTokenLifetime = false 

更新:

为了充实一些细节:我们有一个混合的MVC Angular Web应用程序。 许多MVC菜单项,每个菜单项都导致该菜单项的Angular“单页应用程序”。 MVC用于路由,身份validation和授权。 此外,还会检索其他声明并将其附加到当前主体服务器端。 菜单项是受Authorized和ClaimsPrincipalPermission属性保护的MVC控制器。 由于网页将在Azure中运行,因此我们将默认的sessionProvider更改为Microsoft.Web.Redis.RedisSessionStateProvider。 只有MVC服务器端与此redis会话缓存进行通信。 通过授权的受保护MVC控制器与Angular共享承载令牌(非刷新令牌),然后将其存储在浏览器会话存储中(类似于adal.js使用localstorage?)Angular从支持CORS的API获取JSON内容在与MVC应用程序不同的域中。 API和MVC应用程序也属于两个不同的Azure AD应用程序。

你似乎在这里穿越流动。 如果您使用JavaScript进行调用,则应在客户端中获取令牌 – 例如http://www.cloudidentity.com/blog/2014/10/28/adal-javascript-and-angularjs-deep-dive/ 。 结果为cookie的基于重定向的身份validation流程不适合您通过JavaScript调用API的方案。 此外,如果我理解正确,您将获得一个令牌作为私人客户端,然后在带内(redis缓存)与在用户代理内运行的公共客户端共享它。 从安全角度来看,这是一个禁忌。

这就是说:如果你真的真的想跟上你目前的路线,我建议你去看看http://www.cloudidentity.com/blog/2014/04/28/use-owin-azure-ad-to -secure-both-mvc-ux-and-web-api-in-the-project- for /实现Web UX和Web API路由之间的完全分离。