为什么 Azure AD或其他 OIDC Idp需要在注销后输入用户凭据才能登录?

问题描述

我在我的应用程序中通过外部 idps 开发了身份验证。虽然我支持使用 OpenId Connect 协议的两个 idps:Azure AD 和 Okta。我的登录页面有用于输入用户凭据的小部件(用于内置用户和从 Active Directory 导入的域用户)和两个按钮:“使用 Microsoft 登录”和“使用 Okta 登录”。

用户第一次被重定向登录页面,他尝试通过 Okta(或 Azure AD)登录。如果他在尝试之前已经登录 Okta(或 Azure AD),他将自动登录我的应用程序,而无需输入他的凭据(SSO 操作)。但是,如果他退出我的应用程序,下次他尝试通过 Okta 登录时,他将被重定向到 Okta 同意页面,并且需要输入他的凭据

为什么第二次和下一次尝试需要用户的凭据,但不会导致自动登录? 这是 SSO 概念吗? 我在 Asp.net MVC 上开发并使用 OWIN (Katana)。 谢谢!

解决方法

用户退出身份提供商的一个可能原因是您的代码在您调用 SignOut 时有意这样做。

例如,如果您正在调用:

HttpContext.GetOwinContext().Authentication.SignOut(AuthTypes.Okta,AuthTypes.Cookies);

您明确表示要触发 AuthTypes.Cookies(可能会清除您的应用程序自己的会话 cookie)和 AuthTypes.Okta(可能包括重定向到 Okta 以结束会话并清除饼干也在那边)。

如果您只想结束与您的应用的会话(但不一定结束用户与身份提供者的会话),则在调用 SignOut 时,您应该只指明您的应用的身份验证类型:

HttpContext.GetOwinContext().Authentication.SignOut(AuthTypes.Cookies);

此后,当用户再次访问该应用时,该应用将不会考虑用户已登录(因为当用户的浏览器访问该应用时,它不会呈现任何会话 cookie)。但是,如果用户再次被发送到 Okta 或 Azure AD,身份提供商自己的该用户的会话 cookie 将仍然存在,并且他们将能够在没有额外提示的情况下进行 SSO。

注意:我对 AuthTypes.OktaAuthTypes.Cookies 的配置方式做了一些假设,因为问题中没有包含这些内容。