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

Why does Azure AD (or other OIDC Idp) require to enter user credentials for sign-in after sign-out?

我在我的应用程序中通过外部 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 以结束会话)的注销并清除那边的 cookies)。

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

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

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

注意:我对 AuthTypes.OktaAuthTypes.Cookies 的配置方式做了一些假设,因为这不包括在问题中。