2012-05-07 44 views
12

Chúng tôi đang cố gắng sử dụng máy chủ CAS cho SSO cho các ứng dụng dựa trên web hiện có của chúng tôi. Mục tiêu của chúng tôi làJASIG CAS Đăng nhập mà không có màn hình đăng nhập CAS

  • Đạt được SSO trên các ứng dụng khác nhau (bao gồm cả tên miền chéo).
  • Có trang đăng nhập tùy chỉnh (trong điều khoản giao diện người dùng) cho các ứng dụng khác nhau, khi chúng được chuyển hướng đến trang đăng nhập CAS Server.
  • Khả năng đăng nhập mà không cần truy cập trang Đăng nhập CAS, lý do là "Đăng nhập nhỏ " được nhúng vào trang và người dùng sẽ không được chuyển hướng đến trang đăng nhập CAS để có khả năng sử dụng tốt hơn.

Chúng tôi đã hoàn thành mục tiêu đầu tiên và thứ hai. Nhưng có vấn đề với thứ ba.

Đối với chức năng này, chúng tôi đang cố gắng sao chép các hành động giống như trong mục tiêu thứ hai, chỉ có sự khác biệt khi gửi/đăng dữ liệu (thông tin đăng nhập, vé đăng nhập, v.v ...) từ trang đăng nhập không phải CAS.

  • Chúng tôi không thể sử dụng khung nội tuyến để hiển thị trang đăng nhập CAS trong phần nhỏ, điều này dễ bị tổn thương do các vấn đề tương thích với trình duyệt.
  • Chúng tôi không thể sử dụng ajax để sử dụng CAS api để nhận vé đăng nhập và thực hiện bài đăng HTTP (cross domain issue)
  • Điều chúng tôi đã thực hiện là: Truy lục loginticket và id thực thi trên tải trang đăng nhập không phải cas bằng cách thực hiện một bài đăng HTTP ở phía máy chủ. khi chúng tôi đăng tên người dùng/mật khẩu cùng với loginticket và execId, máy chủ CAS thay vì chấp nhận dữ liệu bài đăng chuyển hướng người dùng đến trang đăng nhập CAS nhưng thực hiện lại trình duyệt và gửi lại dữ liệu hoạt động tốt. Lý do là không có jsession extablished giữa CAS và trình duyệt và do đó CAS từ chối bất kỳ dữ liệu bài. Chúng tôi có thể sử dụng CAS restAPI nhưng nó sẽ chỉ đăng nhập người dùng và không giúp đỡ trong việc thực hiện SSO.

Bất kỳ suy nghĩ nào về cách chúng tôi có thể xử lý vấn đề này ??

Cảm ơn, Pratik

Trả lời

0

Tôi biết trễ nhưng nếu ai đó đang tìm kiếm câu trả lời thì đây là cách tôi giải quyết vấn đề này. Đây là mã tôi đặt trong 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> 

Và trong webapp của bạn, bạn chỉ cần gửi một bản kiến ​​nghị POST tới máy chủ CAS của bạn.

Hy vọng nó giúp

0
  1. Bạn phải nhận được một bản sao của mã CAS chính thức nguồn khách hàng (cas-client-core, https://github.com/apereo/java-cas-client), và chắc chắn rằng bạn có thể biên dịch nó.

  2. Bạn cần thay đổi mã chức năng doFilter() tại org.jasig.cas.client.authentication.AuthenticationFilter trong mã nguồn của khách hàng như dưới đây.

    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. Thêm lõi lõi khách hàng đã biên dịch của bạn vào sự phụ thuộc của ứng dụng web khách của bạn.

  4. Thêm caslogin.jsp vào ứng dụng web ứng dụng khách của bạn.

 <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. Sửa web.xml trong webapp khách hàng. Thêm mã dưới đây trong bộ lọc của 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. Chỉnh sửa mã tại cas-server-webapp/WEB-INF/xem/jsp/mặc định/ui/casLoginView.jsp trong ứng dụng web của máy chủ CAS.

<% 
 
    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. chắc chắn rằng bạn có thể đăng nhập cas với caslogin.jsp.
  2. Đặt nội dung của trang đăng nhập của riêng bạn vào caslogin.jsp.
  3. Bây giờ bạn có thể đăng nhập cas với caslogin.jsp của riêng bạn

tôi cũng làm cho một mẫu về làm thế nào để đăng nhập cas với màn hình đăng nhập của khách hàng tùy chỉnh chứ không phải là đăng nhập máy chủ srceen. Bạn có thể tải nó trên
https://github.com/yangminxing/cas-custom-login-page

0

để đăng nhập cas mà không cần trang màn hình đăng nhập, tôi tùy chỉnh chảy đăng nhập (viết một hành động-state)

1.In đăng nhập-webflow.xml bạn viết hành động trạng thái khác của quá trình chuyển đổi trong id trạng thái hành động = "generateLoginTicket". Trong trạng thái hành động này (tôi gọi nó là submitNotUseForm), tôi làm cùng trạng thái hành động "realSubmit".

2.In đánh giá của "submitNotUseForm" -> lớp AuthenticationViaFormAction, tôi viết phương pháp submitNotForm() và kiểm tra:

2.1: nếu không có cuộc gọi dịch vụ, nó trả lại giá trị cho cuộc gọi đến "viewLoginForm" khác Tôi nhận thông số từ yêu cầu được thiết lập cho thông tin đăng nhập

2.2: Mọi thứ khác đều làm cùng phương pháp gửi

Nó phù hợp với tôi!

Các vấn đề liên quan