keycloak-developers

Details

diff --git a/broker/kerberos/src/main/java/org/keycloak/broker/kerberos/KerberosIdentityProvider.java b/broker/kerberos/src/main/java/org/keycloak/broker/kerberos/KerberosIdentityProvider.java
index 56b30fd..84ceb22 100644
--- a/broker/kerberos/src/main/java/org/keycloak/broker/kerberos/KerberosIdentityProvider.java
+++ b/broker/kerberos/src/main/java/org/keycloak/broker/kerberos/KerberosIdentityProvider.java
@@ -103,15 +103,23 @@ public class KerberosIdentityProvider extends AbstractIdentityProvider<KerberosI
             logger.trace("Sending back " + HttpHeaders.WWW_AUTHENTICATE + ": " + negotiateHeader);
         }
 
-        // Error page is rendered just if browser is unable to send Authorization header with SPNEGO token
-        Response response = request.getSession().getProvider(LoginFormsProvider.class)
+        Response response;
+        LoginFormsProvider loginFormsProvider = request.getSession().getProvider(LoginFormsProvider.class)
                 .setRealm(request.getRealm())
                 .setUriInfo(request.getUriInfo())
-                .setClient(request.getClientSession().getClient())
-                .setClientSessionCode(getRelayState(request))
-                .setWarning("errorKerberosLogin")
-                .setStatus(Response.Status.UNAUTHORIZED)
-                .createLogin();
+                .setStatus(Response.Status.UNAUTHORIZED);
+
+        if (request.getClientSession().getUserSession() == null) {
+            // User not logged. Display HTML with login form as fallback if SPNEGO token not found
+            response = loginFormsProvider.setClient(request.getClientSession().getClient())
+                    .setClientSessionCode(getRelayState(request))
+                    .setWarning("errorKerberosLogin")
+                    .createLogin();
+        } else {
+            // User logged and linking account. Display HTML with error if SPNEGO token not found
+            response = loginFormsProvider.setError("errorKerberosLinkAccount")
+                    .createErrorPage();
+        }
 
         response.getMetadata().putSingle(HttpHeaders.WWW_AUTHENTICATE, negotiateHeader);
         return AuthenticationResponse.fromResponse(response);
diff --git a/forms/common-themes/src/main/resources/theme/login/base/messages/messages.properties b/forms/common-themes/src/main/resources/theme/login/base/messages/messages.properties
index 3819d67..ad76cf2 100755
--- a/forms/common-themes/src/main/resources/theme/login/base/messages/messages.properties
+++ b/forms/common-themes/src/main/resources/theme/login/base/messages/messages.properties
@@ -98,7 +98,8 @@ actionPasswordWarning=You need to change your password to activate your account.
 actionEmailWarning=You need to verify your email address to activate your account.
 actionFollow=Please fill in the fields below.
 
-errorKerberosLogin=Unable to login with Kerberos. Request Kerberos ticket or use different login mechanism
+errorKerberosLogin=Kerberos ticket not available. Use different login mechanism
+errorKerberosLinkAccount=Kerberos ticket not available.
 
 successHeader=Success!
 errorHeader=Error!