ASP.net WebForms中的AzureAD和OpenIdConnect会话到期

时间:2018-10-11 05:58:56

标签: asp.net azure-active-directory openid-connect adal

我有一个ASP.net WebForms应用程序,已根据本文将其配置为与Azure Active Directory和OpenIDConnect一起使用: http://www.cloudidentity.com/blog/2014/07/24/protecting-an-asp-net-webforms-app-with-openid-connect-and-azure-ad/

通常来说,它可以正常工作。但是有时候,在较长时间的不活动之后(例如,填写大表格),用户被重定向到应用程序的主页,并且他从表格中获得的数据会丢失。这当然很令人困惑。

似乎在某个时候会话(令牌?)到期了,需要重新进行身份验证。在重定向时,我能够跟踪到https://login.windows.net/ ...的HTTP 302。这样就可以证实我关于通过AAD重新认证的假设。

我不能确切地说出这种情况多久发生一次-对我而言,它似乎并不是固定间隔的。我试图通过删除Cookie AspNet.CookiesASP.NET_SessionId来重现此行为,但它没有引起重定向。与应用程序进行交互只是自动重新创建了这些cookie。

我的问题是:

  1. 是否还有其他位置(本地存储?)用于保存有关登录信息的信息?
  2. 如何(在后台,静默地)确保会话/令牌有效?

2 个答案:

答案 0 :(得分:0)

在您的初始化代码中,假设您已经按照所链接文章的说明进行操作,则这样一行,

app.UseCookieAuthentication(new CookieAuthenticationOptions());

将身份验证委派给身份提供程序时,您的应用程序仍会根据控制生存期的身份验证结果删除一些cookie。您可以根据需要调整这些设置。...例如

appBuilder.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType ="Cookies",
    ExpireTimeSpan = TimeSpan.FromMinutes(60), // Expire after an hour
    SlidingExpiration = true // use sliding expiration..
});

查看文档以了解您可以配置的内容-https://docs.microsoft.com/en-us/previous-versions/aspnet/dn385599(v%3Dvs.113)

此外,只要它认为需要与身份提供者进行交互,就会触发一个事件,该事件在OpenIdConnectAuthenticationOptions的Notifications对象下可用。您可能感兴趣的一种是 RedirectToIdentityProvider

private void ConfigureOpenIdConnect()
{
    var openIdConnectAuthenticationOptions = new OpenIdConnectAuthenticationOptions
    {
        // the rest of your settings....then
        Notifications =
            new OpenIdConnectAuthenticationNotifications
            {
              RedirectToIdentityProvider =
                    async context => await RedirectToIdentityProviderHandler(context)
            },
            UseTokenLifetime = false
    };
}            

private static Task RedirectToIdentityProviderHandler(
    RedirectToIdentityProviderNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification)
{
    // do some logging whenever you app is redirecting to the IDP
    return Task.FromResult(0);
}

UseTokenLifetime在这里很有趣,因为您的身份令牌具有到期时间,并且默认情况下,应用程序中的cookie生命周期是令牌的生命周期。如果您想自己控制cookie的生存期(按照第一个代码段),请在此处将其设置为false并由您自己明确控制。

您可以结合使用以下方法:覆盖身份令牌生存期,更长的cookie生存期,将滑动过期设置为true以及在身份提供程序发生重定向时进行一些登录。

但是,显然,调整设置太多会增加攻击向量,因此请仔细考虑您的安全要求。

答案 1 :(得分:0)

您知道,通过AAD成功登录后,您将获得ID令牌。 ID令牌是具有到期时间的Jwt格式。您可以使用powershell更改ID令牌的生存期。请参阅本文档https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-configurable-token-lifetimes#access-token-lifetime