12

既存の Web ベースのアプリケーションの SSO に CAS サーバーを使用しようとしています。私たちの目標は

  • さまざまなアプリケーション (クロス ドメインを含む) で SSO を実現します。
  • アプリが CAS サーバーのログイン ページにリダイレクトされるときに、さまざまなアプリ用にカスタマイズされたログイン ページ (UI 用語) を用意します。
  • CAS ログイン ページに移動せずにログインできる機能。その理由は、「小さなログイン セクション」がページ自体に埋め込まれており、ユーザーがより使いやすくするために CAS ログイン ページにリダイレクトされないためです。

1つ目と2つ目のゴールができました。しかし、3番目のものに問題があります。

この機能のために、2 番目の目標と同じアクションを再現しようとしていますが、CAS 以外のログイン ページからのデータ (資格情報、ログイン チケットなど) の送信/投稿のみが異なります。

  • 小さなセクションに iframe を使用して CAS ログイン ページを表示することはできません。これは、ブラウザの互換性の問題に対して脆弱です。
  • ajax を使用して CAS API を使用してログイン チケットを取得し、HTTP ポストを実行することはできません (クロス ドメインの問題)。
  • サーバー側で HTTP ポストを実行することにより、非 cas ログイン ページのロード時に loginticket と実行 ID を取得します。loginticket および execId とともにユーザー名/パスワードを投稿すると、投稿データを受け入れる代わりに CAS サーバーがユーザーを CAS ログイン ページにリダイレクトしますが、ブラウザを元に戻してデータを再度送信すると正常に動作します。理由は、CAS とブラウザーの間で jsession が確立されていないため、CAS は投稿データを拒否します。CAS の restAPI を使用できますが、ユーザーがログインするだけで、SSO の実行には役立ちません。

この問題をどのように処理できるかについて何か考えはありますか??

ありがとう、プラティック

4

4 に答える 4

1

それについて議論しているCASに関するwikiページがあります:https ://wiki.jasig.org/display/CAS/Using+CAS+without+the+Login+Screen(しかし、これはMisaghによって提案されたグーグルグループの議論より古いですM)。

私の解決策は、「外部リンクまたはカスタム外部フォームからのCASの使用」です。

于 2013-01-11T09:29:42.570 に答える
0

遅いことはわかっていますが、誰かが答えを探しているなら、これが私がこれを解決する方法です。これは私が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 で、CAS サーバーに POST 請願を作成するだけです。

それが役に立てば幸い

于 2015-02-10T14:16:03.513 に答える
0

ログイン画面ページなしでcasにログインするには、フローログインをカスタマイズします(別のアクションステートを記述します)

1. login-webflow.xml 内の action-state id="generateLoginTicket" に遷移のその他のアクション状態を記述します。このアクション状態 (submitNotUseForm と呼びます) で、同じ「realSubmit」アクション状態を実行します。

2.「submitNotUseForm」の評価->クラスAuthenticationViaFormActionで、メソッドsubmitNotForm()を記述してチェックします:

2.1: サービス呼び出しがない場合は、「viewLoginForm」への呼び出しの値を返します。それ以外の場合は、資格情報の要求セットからパラメーターを取得します

2.2: 他のすべては同じメソッド送信を行います

それは私のために働く!

于 2016-09-24T01:03:28.490 に答える
0
  1. CAS の公式クライアント ソース コード (cas-client-core、https://github.com/apereo/java-cas-client ) のコピーを取得し、コンパイルできることを確認する必要があります。

  2. 以下のように、クライアント ソース コードの org.jasig.cas.client.authentication.AuthenticationFilter で doFilter() 関数コードを変更する必要があります。

    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);
    
  3. 独自のコンパイル済み cas-client-core をクライアント Web アプリケーションの依存関係に追加します。

  4. caslogin.jsp をクライアント Web アプリケーションに追加します。

     <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")%>" />

  1. クライアント webapp で web.xml を編集します。CASFilter のフィルターに以下のコードを追加します

<init-param>
    <param-name>defaultServerIndexUrl</param-name>
    <param-value>http://clientip:port/webappname/index.jsp</param-value>
</init-param>
<init-param>
    <param-name>customServerLoginUrl</param-name>
    <param-value>http://clientip:port/webappname/caslogin.jsp</param-value>
</init-param>

  1. CAS サーバー Web アプリの cas-server-webapp/WEB-INF/view/jsp/default/ui/casLoginView.jsp のコードを編集します。

<%
  String auto=request.getParameter("auto");
  String customLogin=request.getParameter("customLogin");

  if(auto!=null&&auto.equals("true"))
  {
    %>
    <html>
    <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="username" value="<%=request.getParameter("username")%>" />
      <input type="hidden" name="password" value="<%=request.getParameter("password")%>" />
      <input type="hidden" name="login_form" value="<%=request.getParameter("login_form")%>" />
      <input type="hidden" name="rememberMe" value="true" />
      <input type="submit" value="Submit" style="visibility: hidden" />
    </form>
    </body>
    </html>

    <%
}
else if(customLogin!=null&&customLogin.equals("custom"))
{  
  response.sendRedirect(request.getParameter("customLoginPage")+"?service="+request.getParameter("service"));
%>
<%
}
else
{%>
<!-- The Orgin Source Code of casLoginView.jsp!!!!!!!!!!!!!!!!!!!!!!!!! -->
<%}%>

  1. caslogin.jsp で cas にログインできることを確認してください。
  2. 独自のログイン ページのコンテンツを caslogin.jsp に配置します。
  3. これで、独自の caslogin.jsp で cas にログインできるようになりました

また、サーバーのログイン画面ではなく、クライアントのカスタム ログイン画面を使用して cas にログインする方法についてのサンプルも作成します。https://github.com/yangminxing/cas-custom-login-pageでダウンロードでき ます

于 2016-08-15T08:17:57.263 に答える