首页 文章

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

提问于
浏览
3

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

Problem:

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

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

Additional info

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

enter image description here

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

enter image description here

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

在web api HttpConfiguration中:

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

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

WindowsAzureActiveDirectoryBearerAuthenticationOptions BackChannelTimeout set to 5 days. Still fails

在Web应用程序web.config中:

sessionState timeout="525600" for RedisSessionStateProvider. Still fails

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

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

Update:

为了充实一些细节:我们有一个混合的MVC Angular Web应用程序 . 许多MVC菜单项,每个菜单项都导致该菜单项的Angular“单页应用程序” . MVC用于路由,身份验证和授权 . 此外,还检索其他声明并将其附加到当前主体服务器端 . 菜单项是受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应用程序 .

1 回答

相关问题