我们有一个使用 Azure Active Directory“Easy Auth”的单页应用程序 (SPA),例如无代码解决方案。当用户第一次打开应用程序时,这似乎工作正常。他们被重定向到 Microsoft 登录页面,他们可以进行身份验证,然后访问该应用程序。
然后,因为它是一个 SPA,用户将四处导航并且只触发 Ajax 请求。大约 24 小时后,当 session cookie 过期时,问题就会出现。用户可能仍然打开相同的浏览器选项卡并且不执行整个页面刷新。然后他们可能正在处理记录,在某个时候他们的下一个 Ajax PUT 请求失败并返回重定向 HTTP 状态并且他们失去了他们的工作。
所以他们的关键问题是:
我们如何让 SPA Ajax 请求扩展当前用户的 session ,以便他们的 session 在他们积极使用应用程序时不会过期?
Azure AD Easy Auth 服务似乎没有“尊重”用户的事件,这让我们相信 session cookie 永远不会更新。
注意:我们最近对/.auth/refresh 端点进行了一些测试,但这也没有解决问题。
最佳答案
有几种方法可以解决这个问题。以下是我能想到的一些:
- 使用本地存储:您提到的问题是用户由于重定向而丢失了他们的工作。如果您将正在进行的状态保存在本地存储中,以便在将它们重定向回页面时可用,则可以解决丢失工作的问题。
- 切换到使用 token :
/.auth/refresh
端点在使用 AAD 时不会刷新 AppServiceAuthSession,因为 AAD 不支持刷新用户信息。您可以做的是使用x-zumo-auth
token 向您的后端进行身份验证。/.auth/refresh
端点将正确刷新这些 token 。如果您使用/.auth/login/aad
显式登录用户,则可以将session_mode=token
添加为查询字符串参数。如果您使用 Mobile Apps JavaScript SDK,这是为您完成的.如果登录是自动的,那么您需要在身份验证配置的additionalLoginParams
设置中添加session_mode=token
。然后,您可以从登录完成后添加到 URL 的 #token 片段中解析身份验证 token 。 - 使用隐藏的 iframe:我自己还没有尝试过,但如果您可以让它工作,它可能需要最少的代码更改。这个想法是,当您检测到用户处于事件状态时,您可以使用隐藏的 iframe 定期重新登录用户。 iframe 需要指向类似
./auth/login/aad?prompt=none&domain_hint={userdomain.com}
的内容,其中{userdomain.com}
是最后一部分用户的电子邮件地址 - 例如contoso.com。这些参数被传递到 AAD 登录页面,登录应该自动完成,无需任何用户交互。在浏览器窗口中手动测试几次以确保其正常工作。结果应该是一个更新后的身份验证 cookie,具有新的到期时间。
如果您对这些选项有任何疑问或问题,请在评论中告诉我。
关于azure-web-app-service - 即使用户正在积极使用应用程序,Azure AD Easy Auth 也会过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45819990/