JASIG CAS Вход без экрана входа CAS
Мы пытаемся использовать CAS-сервер для SSO для существующих веб-приложений. Наши цели
- Активировать SSO для различных приложений (включая перекрестный домен).
- У вас есть страницы с настройками входа (в пользовательском интерфейсе) для разных приложений, когда они перенаправляются на страницу входа в CAS Server.
- Возможность входа в систему без перехода на страницу входа в CAS, причина: "Маленький логин"
раздел "встроен в страницу, и пользователь не будет перенаправлен на страницу входа в CAS для лучшего удобства использования.
Мы закончили с первой и второй целью. Но проблемы с третьим.
Для этой функции мы пытаемся воспроизвести те же действия, что и во второй цели, только разница заключается в отправке/публикации данных
(учетные данные, входные билеты и т.д.) с страницы входа в систему не CAS.
- Мы не можем использовать iframes для отображения страницы входа в CAS в небольшом разделе, это уязвимо для проблем совместимости браузера.
- Мы не можем использовать ajax для использования CAS api для получения логина входа и выполнения HTTP-сообщения (проблема с перекрестным доменом)
- Мы выполнили следующие действия: Восстановите идентификатор loginticket и исполняемый файл при загрузке страницы входа в систему non cas, выполнив HTTP-сообщение на стороне сервера.
когда мы публикуем имя пользователя/пароль вместе с loginticket и execId, сервер CAS вместо принятия данных сообщения
перенаправляет пользователя на страницу входа в CAS, но делает браузер обратно и отправка данных снова работает нормально. Причины
это не jasession, который был использован между CAS и браузером, и поэтому CAS отклоняет любые данные post. Мы можем использовать CAS restAPI, но он просто будет входить в систему пользователя и не будет помогать в выполнении SSO.
Любые мысли о том, как мы можем справиться с этой проблемой?
Спасибо,
Pratik
Ответы
Ответ 1
В CAS есть страница wiki, которая обсуждает это: https://wiki.jasig.org/display/CAS/Using+CAS+without+the+Login+Screen (но старше обсуждение групп Google, предложенное Misagh M).
Мое решение " Использование CAS из внешней ссылки или пользовательской внешней формы".
Ответ 2
Я знаю его опоздание, но если кто-то ищет ответ, то я как-то решаю это. Это код, который я поставил в casLoginView.jsp
<head>
<script language="javascript">
function doAutoLogin() {
document.forms[0].submit();
}
</script>
</head>
<body onload="doAutoLogin();">
<form id="credentials" method="POST" action="<%= request.getContextPath() %>/login?service=<%= request.getParameter("service") %>">
<input type="hidden" name="lt" value="${loginTicket}" />
<input type="hidden" name="execution" value="${flowExecutionKey}" />
<input type="hidden" name="_eventId" value="submit" />
<input type="hidden" name="serviceLogin" value="<%= request.getParameter("serviceLogin") %>"/>
<input type="hidden" name="username" value="<%= request.getParameter("username") %>" />
<input type="hidden" name="password" value="<%= request.getParameter("password") %>" />
<%
if ("true".equals(request.getParameter("rememberMe"))) {%>
<input type="hidden" name="rememberMe" id="rememberMe" value="true"/>
<% } %>
<input type="submit" value="Submit" style="visibility: hidden;" />
</form>
<% } else {
response.sendRedirect(request.getParameter("redirectURL"));
}
%>
</body>
И в вашем webapp просто сделайте петицию POST на ваш сервер CAS.
Надеюсь, что это поможет
Ответ 3
-
Вы должны получить копию официального клиентского исходного кода CAS (cas-client-core, https://github.com/apereo/java-cas-client) и сделать что вы можете скомпилировать его.
-
Вам нужно изменить код функции doFilter() на org.jasig.cas.client.authentication.AuthenticationFilter в исходном коде клиента, как показано ниже.
final HttpServletRequest request = (HttpServletRequest) servletRequest;
final HttpServletResponse response = (HttpServletResponse) servletResponse;
final HttpSession session = request.getSession(false);
final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null;
if(request.getServletPath().toLowerCase().equals("/caslogout.jsp"))
{
// Set the custom client login page when you logout from CAS server.
request.setAttribute("casServerLogoutUrl",casServerLoginUrl.replace("login","logout"));
request.setAttribute("customServerLoginUrl",customServerLoginUrl);
//We must remove the attribute of CONST_CAS_ASSERTION manually
if(session!=null)
session.removeAttribute(CONST_CAS_ASSERTION);
filterChain.doFilter(request, response);
return;
}
if (assertion != null) {
filterChain.doFilter(request, response);
return;
}
// Although the custom login page must called caslogin, here you can change it.
if(request.getServletPath().toLowerCase().equals("/caslogin.jsp"))
{
//Set the a default parameter to the caslogin
request.setAttribute("defaultServerIndexUrl",defaultServerIndexUrl);
request.setAttribute("casServerLoginUrl",casServerLoginUrl);
filterChain.doFilter(request, response);
return;
}
final String serviceUrl = constructServiceUrl(request, response);
final String ticket = CommonUtils.safeGetParameter(request,getArtifactParameterName());
final boolean wasGatewayed = this.gatewayStorage.hasGatewayedAlready(request, serviceUrl);
if (CommonUtils.isNotBlank(ticket) || wasGatewayed) {
filterChain.doFilter(request, response);
return;
}
final String modifiedServiceUrl;
log.debug("no ticket and no assertion found");
if (this.gateway) {
log.debug("setting gateway attribute in session");
modifiedServiceUrl = this.gatewayStorage.storeGatewayInformation(request, serviceUrl);
} else {
modifiedServiceUrl = serviceUrl;
}
if (log.isDebugEnabled()) {
log.debug("Constructed service url: " + modifiedServiceUrl);
}
final String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl, getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway);
if (log.isDebugEnabled()) {
log.debug("redirecting to \"" + urlToRedirectTo + "\"");
}
// Add a custom server login url parameter to the CAS login url.
response.sendRedirect(urlToRedirectTo+"&customLogin=custom&customLoginPage="+customServerLoginUrl);
-
Добавьте свой собственный скомпилированный cas-client-core к зависимости вашего клиента webapp.
-
Добавьте caslogin.jsp к вашему клиенту webapp.
<form method="GET" action="<%=request.getAttribute("casServerLoginUrl")%>">
<p>Username : <input type="text" name="username" /></p>
<p>Password : <input type="password" name="password" /></p>
<p><input type="submit" value="Login" /></p>
<input type="hidden" name="auto" value="true" />
<input type="hidden" name="service" value="<%=request.getParameter("service")==null?request.getAttribute("defaultServerIndexUrl"):request.getParameter("service")%>" />
Ответ 4
чтобы войти в систему без страницы входа в систему, я пользовательский логин потока (напишите другое действие-состояние)
1. В login-webflow.xml вы пишете другое действие-состояние перехода в action-состоянии id = "generateLoginTicket". В этом состоянии действия (я называю это submitNotUseForm), я делаю то же самое действие "realSubmit".
2.В оценке "submitNotUseForm" → class AuthenticationViaFormAction, я пишу метод submitNotForm() и проверяю:
2.1: если у вас нет служебного вызова, оно возвращает значение для вызова "viewLoginForm" else Я получаю параметр из набора запросов для учетных данных
2.2: Все остальное делает тот же метод submit
Это работает для меня!