Iva*_*anL 4 session azure azure-active-directory azure-ad-b2c
情况
我有一个使用Azure AD B2C作为其身份验证的Web应用程序。我们正在使用OWIN OpenIdConnect来处理此过程。会话超时设置为15分钟(web.config中和AzureADB2C登录策略中的sessionState),并且在策略级别的策略中启用了SSO。该会话设置为滚动。OWIN CookieAuthentication也使用15m的滑动到期时间。
Web应用程序分为多个部分(虚拟文件夹),但是都共享同一个Azure AD B2C实例。但是,每个人在AD中都有自己的应用程序注册。(这些基本上是国家/地区,因此我们有www.site.com/nl和www.site.com/de)。这是为了确保登录时也能正确定向到您所在的国家/地区。使我们能够将一个国家链接到另一个AD实例(如果需要)。
问题
当用户登录该应用程序,然后随后在其会话中注销时,登录过程将正常运行而不会出现问题,并且在尝试再次登录时,要求他/她再次登录。没关系,而且符合预期。
但是,当用户登录并让他/她的会话到期时,我们会显示一个弹出窗口,询问您是要继续(链接到登录页面)还是退出(链接到注销页面)。在这两种情况下,用户都不需要提供他/她的凭据,这也不是我们所希望的行为(这意味着如果有人将其帐户保持打开状态并且发生超时,那么任何人都仍可以登录而无需提供凭据)
养护
https://login.microsoftonline.com/myazuread.onmicrosoft.com/oauth2/v2.0/logout?p=b2c_1_mypolicyname&post_logout_redirect_uri=https%3a%2f%2fwww.site.com%2fbe&x-client-SKU=ID_NET&x-client-ver=1.0.40306.1554与用户在会话期间注销时完全相同的URL 。但是,在此调用中,我在Azure端看到了2种不同的行为。A)当会话未到期时,此呼叫将先进入,https://login.microsoftonline.com/my-azure-ad-guid/oauth2/logout然后再重定向到我的重定向uri。
B)当会话过期时,此调用将直接重定向到我的重定向uri,而不会在情况A下跳过uri。
情况A和情况B之间存在1个cookie差异,x-ms-cpim-sso:myazuread.onmicrosoft.com/b2c_1_mypolicyname它仅在情况A中存在,这使我相信这会导致不同的行为。但是,这是login.microsoftonline.com域上的Microsoft cookie,因此我对此没有控制或影响。
当会话超时后初始化登录时,我看到呼叫通过包含与我的任何应用程序都不匹配的clientid传递:https://login.microsoftonline.com/myazuread.onmicrosoft.com/oauth2/authorize?client_id=bb2a2e3a-c5e7-4f0a-88e0-8e01fd3fc1f4&redirect_uri=https%3a%2f%2flogin.microsoftonline.com%2fte%2fmyazuread.onmicrosoft.com%2foauth2%2fauthresp&response_type=id_token&scope=email+openid&response_mode=query&nonce=nonce&nux=1&nca=1&domain_hint=myazuread.onmicrosoft.com&mkt=en-US&lc=1033&state=StateProperties这为我提出了一个问题,该应用程序是什么,为什么在我的身份验证流程中使用它,导致我的用户无法使用需要重新认证?
问题:如何确保用户在每次会话超时后都需要进行身份验证?
因此,在与Microsoft支持团队合作几周之后,我们终于有了一个明确的答案和明确的解决方案:
您正在使用登录策略。由于遗留原因,当您为“登录策略”调用/ authorize终结点时,您首先单击Azure AD B2C服务,然后立即将其重新路由到Azure AD服务。然后,Azure AD服务(而不是Azure AD B2C)实际显示用户名/密码的字段。输入有效的用户名/密码后,Azure AD出于SSO原因将cookie存储在客户端计算机上,将客户端重定向回Azure AD B2C,然后铸造一个令牌并将B2C令牌返回给应用程序,并存储其自己的令牌出于SSO原因的Cookie。换句话说,Azure AD B2C联合到Azure AD进行登录,Azure AD和Azure AD B2C都有自己的cookie来维护SSO。
现在,当您调用注销到Azure AD B2C或Azure AD B2C的会话到期时,Azure AD B2C会执行其操作来关闭会话,即删除cookie。但是,它不会删除Azure AD cookie。这意味着当您再次登录时,Azure AD B2C会识别您未登录,并调用Azure AD。因为Azure AD植入了cookie或Azure AD的会话没有过期,所以它是SSO用户,并且用户无需再次输入用户名/密码(这是您不希望的确切行为)。
若要暂时解决此问题,请在调用Azure AD B2C的注销终结点之后,也调用Azure AD的注销终结点。Azure AD的注销终结点与Azure AD B2C的注销终结点相同,但URL中没有策略。对于会话到期,您还需要限制Azure AD的会话超时。
我们正在制定不依赖Azure AD的登录策略(当前处于私有预览状态)。我们也正在研究解决原始登录策略的问题。
我的问题的解决方案的确是使用指示令牌生存期的策略来限制Azure AD本身的会话超时。这是我设置的策略,通常在租户的所有会话上都将其过期至15分钟(这是我们的愿望,如果您仅想为特定应用程序设置此策略,请阅读本文)
Connect-AzureAD
New-AzureADPolicy -Definition @('{"TokenLifetimePolicy":{"Version":1, "MaxAgeSessionSingleFactor":"0.00:15:00","MaxAgeSessionMultiFactor":"0.00:15:00"}}') -DisplayName "TokenLifetimeDefaultPolicy" -IsOrganizationDefault $true -Type "TokenLifetimePolicy"
Disconnect-AzureAD
Run Code Online (Sandbox Code Playgroud)
感谢Microsoft支持。
| 归档时间: |
|
| 查看次数: |
2400 次 |
| 最近记录: |