diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/AuthProvider.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/AuthProvider.tsx index e9e63df2c1c5..f4d3998cdbc9 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/AuthProvider.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/AuthProvider.tsx @@ -177,6 +177,8 @@ export const AuthProvider = ({ const onLogoutHandler = useCallback(async () => { clearTimeout(timeoutId); + sessionStorage.setItem('om_explicit_logout', 'true'); + // Let SSO complete the logout process await authenticatorRef.current?.invokeLogout(); diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/LoginPage/SignInPage.test.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/LoginPage/SignInPage.test.tsx index a31d06fdd1f7..449c27536009 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/LoginPage/SignInPage.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/LoginPage/SignInPage.test.tsx @@ -139,6 +139,30 @@ describe('Test SignInPage Component', () => { expect(signinButton).toBeInTheDocument(); }); + it('should NOT auto-redirect after explicit logout', async () => { + sessionStorage.setItem('om_explicit_logout', 'true'); + + const onLoginHandler = jest.fn(); + mockUseAuthProvider.mockReturnValue({ onLoginHandler }); + + mockuseApplicationStore.mockReturnValue({ + isAuthDisabled: false, + authConfig: { provider: 'azure', enableAutoRedirect: true }, + onLogoutHandler: jest.fn(), + getOidcToken: jest.fn(), + }); + + const { container } = render(, { + wrapper: MemoryRouter, + }); + + const signinButton = await findByText(container, /label.sign-in-with-sso/i); + + expect(signinButton).toBeInTheDocument(); + expect(onLoginHandler).not.toHaveBeenCalled(); + expect(sessionStorage.getItem('om_explicit_logout')).toBeNull(); + }); + it('SSO providers should auto-redirect when enableAutoRedirect is true', async () => { const onLoginHandler = jest.fn(); mockUseAuthProvider.mockReturnValue({ onLoginHandler }); diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/LoginPage/SignInPage.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/LoginPage/SignInPage.tsx index 877246c4fc88..f8d9dbed3322 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/LoginPage/SignInPage.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/LoginPage/SignInPage.tsx @@ -68,6 +68,17 @@ const SignInPage = () => { const { handleLogin } = useBasicAuth(); + const [isPostLogout] = useState(() => { + const flag = sessionStorage.getItem('om_explicit_logout'); + if (flag) { + sessionStorage.removeItem('om_explicit_logout'); + + return true; + } + + return false; + }); + const handleSignIn = useCallback(() => { onLoginHandler && onLoginHandler(); }, [onLoginHandler]); @@ -76,7 +87,8 @@ const SignInPage = () => { authConfig?.enableAutoRedirect && !isAuthProviderBasic && !isAuthenticated && - Boolean(onLoginHandler); + Boolean(onLoginHandler) && + !isPostLogout; useLayoutEffect(() => { if (shouldAutoRedirect && !hasTriggeredAutoRedirect.current) {