Source:
<code>public void validate(final TokenCredentials credentials, final WebContext context) { init(); final String ticket = credentials.getToken(); try { final String finalCallbackUrl = callbackUrlResolver.compute(urlResolver, callbackUrl, clientName, context); final Assertion assertion = configuration.retrieveTicketValidator(context).validate(ticket, finalCallbackUrl); final AttributePrincipal principal = assertion.getPrincipal(); logger.debug("principal: {}", principal); final String id = principal.getName(); final Map<String, Object> newAttributes = new HashMap<>(); final Map<String, Object> attributes = principal.getAttributes(); if (attributes != null) { for (final Map.Entry<String, Object> entry : attributes.entrySet()){ final String key = entry.getKey(); final Object value = entry.getValue(); final Object restored = ProfileHelper.getInternalAttributeHandler().restore(value); newAttributes.put(key, restored); } } final CommonProfile profile; if (configuration.getProxyReceptor() != null) { profile = getProfileDefinition().newProfile(principal, configuration.getProxyReceptor()); profile.setId(ProfileHelper.sanitizeIdentifier(profile, id)); <START> getProfileDefinition().convertAndAdd(profile, newAttributes, null); <END> } else { profile = ProfileHelper.restoreOrBuildProfile(getProfileDefinition(), id, newAttributes, null, principal, configuration.getProxyReceptor()); } logger.debug("profile returned by CAS: {}", profile); credentials.setUserProfile(profile); } catch (final TicketValidationException e) { String message = "cannot validate CAS ticket: " + ticket; throw new TechnicalException(message, e); } }</code><technical_language>Instead of null, authentication attributes retrieved assertion.getAttributes()</technical_language>

Target:
public void validate(final TokenCredentials credentials, final WebContext context) { init(); final String ticket = credentials.getToken(); try { final String finalCallbackUrl = callbackUrlResolver.compute(urlResolver, callbackUrl, clientName, context); final Assertion assertion = configuration.retrieveTicketValidator(context).validate(ticket, finalCallbackUrl); final AttributePrincipal principal = assertion.getPrincipal(); logger.debug("principal: {}", principal); final String id = principal.getName(); final Map<String, Object> newPrincipalAttributes = new HashMap<>(); final Map<String, Object> newAuthenticationAttributes = new HashMap<>(); final Map<String, Object> oldPrincipalAttributes = principal.getAttributes(); final Map<String, Object> oldAuthenticationAttributes = assertion.getAttributes(); final InternalAttributeHandler attrHandler = ProfileHelper.getInternalAttributeHandler(); if (oldPrincipalAttributes != null) { oldPrincipalAttributes.entrySet().stream() .forEach(e -> newPrincipalAttributes.put(e.getKey(), attrHandler.restore(e.getValue()))); } if (oldAuthenticationAttributes != null) { oldAuthenticationAttributes.entrySet().stream() .forEach(e -> newAuthenticationAttributes.put(e.getKey(), attrHandler.restore(e.getValue()))); } final CommonProfile profile; if (configuration.getProxyReceptor() != null) { profile = getProfileDefinition().newProfile(principal, configuration.getProxyReceptor()); profile.setId(ProfileHelper.sanitizeIdentifier(profile, id)); getProfileDefinition().convertAndAdd(profile, newPrincipalAttributes, newAuthenticationAttributes); } else { profile = ProfileHelper.restoreOrBuildProfile(getProfileDefinition(), id, newPrincipalAttributes, newAuthenticationAttributes, principal, configuration.getProxyReceptor()); } logger.debug("profile returned by CAS: {}", profile); credentials.setUserProfile(profile); } catch (final TicketValidationException e) { String message = "cannot validate CAS ticket: " + ticket; throw new TechnicalException(message, e); } }