Подтвердить что ты не робот

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

4b9b3361

Ответ 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

Это работает для меня!