使用Azure AD时处理Asp.Net MVC中的令牌超时

Jas*_* P. 11 c# asp.net-mvc azure

这更像是一个设计/方法问题......

我想我在这里遗漏了一些东西.我们正在构建一个Asp.Net MVC 5 Web应用程序,并使用以下方案使用Azure AD保护它:

https://azure.microsoft.com/en-us/documentation/articles/active-directory-authentication-scenarios/#web-browser-to-web-application

https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect

令牌/ cookie是绝对到期,并在一小时后到期.那么这对用户体验有何影响?无论如何,他们每小时都必须重新登录?在我们的测试中,当用户过期时,浏览器将重定向回AD并提示用户输入凭据.当然,这会破坏我们加载部分视图的任何AJAX调用,因此我们的DevExpress控件都不会稳定.

基于对此SO帖子的响应: 通过ADAL JavaScript Ajax和KnockoutJs的MVC AD Azure刷新令牌

......我所看到的是预期的?在我看来,对于用户登录并全天工作的云托管业务线应用程序来说,这不是一个非常可行的解决方案.

我错过了什么吗?或者这不是商业应用程序的理想方案?

小智 9

我们遇到了类似的问题,以及如何在具有如此低的会话超时(60分钟)的Web应用程序中使用Azure AD和ASP.NET MVC的相同想法.

我们提出的解决方案似乎是有效的(尽管测试有限),我们在页面上有一个iFrame,我们每隔5分钟刷新一次.

<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" id="refreshAuthenticationIframe" src="@Url.Action("CheckSessionTimeout", "Home", new { area = "" })" style="display:none;"></iframe>
Run Code Online (Sandbox Code Playgroud)

"CheckSessionTimeout"页面基本上是空白的.

在整个应用程序引用的Javascript文件中,我们有:

var pageLoadTime = moment();

setInterval(refreshAuthenticationCookies, 1000);

function refreshAuthenticationCookies() {
    if (moment().diff(pageLoadTime, "seconds") > 300) {
        document.getElementById("refreshAuthenticationIframe").contentDocument.location = "/Home/ForceSessionRefresh";
        pageLoadTime = moment();
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意:时刻是我们使用的JS日期/时间库).在Home控制器上,我们有:

    public ActionResult CheckSessionTimeout() => View();

    public ActionResult ForceSessionRefresh()
    {
        HttpContext.GetOwinContext()
               .Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/Home/CheckSessiontimeout" },
                   OpenIdConnectAuthenticationDefaults.AuthenticationType);

        return null;
    }
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是最好的方式/方法.这是我们能够做的最好的事情来修复Azure AD和ASP.NET MVC应用程序(不是SPA,不使用Web API但使用Ajax调用)的一系列困难约束,相对于我们即将到来的地方对于使用Kerberos身份验证的本地应用程序而言,这一点都不重要(而且我们的用户希望会话超时不是他们想要看到或担心的).