3

我正在使用带有 Web 应用程序和 Web api 的 Azure AD 开发多租户解决方案。Web 应用使用 OpenIdConnect 检索承载令牌(缓存在 Azure Redis 缓存中),该令牌在 Angular 中用于从 Web api 获取 JSON。用户模拟用于 Web 应用和 Web api(在 Azure AD 应用程序中设置)。

问题:

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

我试图增加很多不同的超时时间,但没有任何帮助。我还禁用了 web api 上的所有不记名令牌身份验证。我不明白为什么身份消失以及为什么它有助于刷新客户端。有任何想法吗?:)

附加信息

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

在此处输入图像描述

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

在此处输入图像描述

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

在 web api HttpConfiguration 中:

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

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

WindowsAzureActiveDirectoryBearerAuthenticationOptions BackChannelTimeout set to 5 days. Still fails

在网络应用程序 web.config 中:

sessionState timeout="525600" for RedisSessionStateProvider. Still fails

在 web 应用程序 owin 身份验证过程中,增加了时间跨度并添加了滑动到期。仍然失败:

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 用于路由、身份验证和授权。此外,还会检索附加声明并将其附加到当前主体服务器端。菜单项是受 Authorized 和 ClaimsPrincipalPermission 属性保护的 MVC 控制器。由于网页将在 Azure 中运行,我们将默认 sessionProvider 更改为 Microsoft.Web.Redis.RedisSessionStateProvider。只有 MVC 服务器端与这个 redis 会话缓存对话。不记名令牌(不是刷新令牌)通过授权受保护的 MVC 控制器与 Angular 共享,然后存储在浏览器会话存储中(类似于 adal. js 使用本地存储?)Angular 从启用 CORS 的 API 获取 JSON 内容,该 API 位于与 MVC 应用程序不同的域中。API 和 MVC 应用程序也属于两个不同的 Azure AD 应用程序。

4

1 回答 1

2

你似乎在这里过河。如果您从 JavaScript 进行调用,您应该在客户端获取令牌 - 类似于http://www.cloudidentity.com/blog/2014/10/28/adal-javascript-and-angularjs-deep-dive/。结果是 cookie 的基于重定向的身份验证流程不太适合通过 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-same-project/用于实现 Web UX 和 Web API 路由之间的完全分离。

于 2014-11-25T22:16:47.173 回答