2012-05-07 13 views
12

हम अपने मौजूदा वेब आधारित अनुप्रयोगों के लिए एसएसओ के लिए सीएएस सर्वर का उपयोग करने की कोशिश कर रहे हैं। हमारे लक्ष्यसीएएस लॉगिन स्क्रीन के बिना जेएएसआईजी सीएएस लॉगिन

  • विभिन्न अनुप्रयोगों (क्रॉस डोमेन समेत) में एसएसओ को सक्रिय करें।
  • अलग-अलग ऐप्स के लिए अनुकूलित लॉगिन (UI शर्तों में) पृष्ठ हैं, जब उन्हें सीएएस सर्वर लॉगिन पृष्ठ पर रीडायरेक्ट किया जाता है।
  • सीएएस लॉगिन पृष्ठ पर जाने के बिना लॉगिन करने की क्षमता, "एक छोटा लॉगिन अनुभाग" पृष्ठ में स्वयं एम्बेड किया गया है और उपयोगकर्ता को बेहतर उपयोगिता के लिए सीएएस लॉगिन पृष्ठ पर रीडायरेक्ट नहीं किया जाएगा।

हम पहले और दूसरे लक्ष्य के साथ किए जाते हैं। लेकिन तीसरे के साथ समस्याएं हैं।

इस कार्यक्षमता के लिए हम दूसरे लक्ष्य में समान क्रियाओं को दोहराने की कोशिश कर रहे हैं, केवल अंतर 0 सी 35 लॉगिन पृष्ठ से डेटा (प्रमाण-पत्र, लॉगिन टिकट आदि) सबमिट/पोस्ट कर रहा है।

  • हम छोटे सेक्शन में सीएएस लॉगिन पेज दिखाने के लिए iframes का उपयोग नहीं कर सकते हैं, यह ब्राउज़र संगतता समस्याओं के लिए कमजोर है।
  • हम लॉगिन टिकट प्राप्त करने और HTTP पोस्ट (क्रॉस डोमेन समस्या) करने के लिए सीएएस एपीआई का उपयोग करने के लिए AJAX का उपयोग नहीं कर सकते हैं
  • हमने जो किया है वह है: गैर कैस लॉगिन पृष्ठ के लोड पर लॉगिंटिकेट और निष्पादन आईडी पुनर्प्राप्त करें सर्वर पक्ष पर एक HTTP पोस्ट कर कर। जब हम loginticket और execId के साथ उपयोगकर्ता नाम/पासवर्ड पोस्ट करते हैं, तो पोस्ट डेटा को स्वीकार करने के बजाय सीएएस सर्वर उपयोगकर्ता को सीएएस लॉगिन पृष्ठ पर रीडायरेक्ट करता है लेकिन ब्राउज़र को वापस करने और फिर से डेटा सबमिट करने से ठीक काम करता है। कारण सीएएस और ब्राउज़र के बीच स्थापित कोई जुशन नहीं है और इसलिए सीएएस किसी भी पोस्ट डेटा को अस्वीकार करता है। हम सीएएस रेस्टैपीआई का उपयोग कर सकते हैं लेकिन यह सिर्फ उपयोगकर्ता को लॉगिन करेगा और एसएसओ करने में कोई मदद नहीं करेगा।

इस समस्या को हम कैसे नियंत्रित कर सकते हैं इस पर कोई विचार ??

धन्यवाद, प्रतीक

उत्तर

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 में डाल सिर्फ अपने कैस सर्वर के लिए एक पोस्ट याचिका बनाते हैं।

आशा है कि यह मदद करता है

0
  1. आप कैस आधिकारिक ग्राहक स्रोत कोड (कैस-ग्राहक-कोर, https://github.com/apereo/java-cas-client) की एक प्रति प्राप्त करना चाहिए, और सुनिश्चित करें कि आप यह संकलन सकता है।

  2. आपको org.jasig.cas.client.authentication पर 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. अपने क्लाइंट वेबपैप की निर्भरता के लिए अपना स्वयं का संकलित कैस-क्लाइंट-कोर जोड़ें।

  4. अपने क्लाइंट वेबएप में caslogin.jsp जोड़ें।

 <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
  2. के फिल्टर
में कोड नीचे जोड़े

<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-server-webapp पर कोड/वेब-INF/देखें/jsp/सीएएस सर्वर वेब ऐप में डिफ़ॉल्ट/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 साथ कैस के लिए लॉग इन कर सकता है बनाते हैं।
  2. अपने लॉगिन पृष्ठ की सामग्री caslogin.jsp पर रखें।
  3. अब आप अपने खुद के caslogin.jsp

मैं भी सर्वर लॉगइन srceen ग्राहक कस्टम लॉगिन स्क्रीन के बजाय साथ कैस के लिए लॉग इन करने के बारे में एक नमूना बनाने के साथ कैस के लिए लॉग इन कर सकते हैं। आप
https://github.com/yangminxing/cas-custom-login-page

0

लॉगिन स्क्रीन पृष्ठ के बिना कैस लॉगइन करने के लिए पर इसे डाउनलोड कर सकता है, मैं कस्टम लॉगिन प्रवाह (एक और एक्शन राज्य लिखना)

1.In प्रवेश-webflow.xml आप अन्य कार्रवाई राज्य बारे में एक्शन-स्टेट आईडी = "जेनरलॉगिन टिकट" में संक्रमण का। इस क्रिया-स्थिति में (मैं इसे सबमिट करता हूं NotUseForm), मैं वही "असली सबमिट" क्रिया-राज्य करता हूं।

2.In "submitNotUseForm" का मूल्यांकन -> वर्ग AuthenticationViaFormAction, मैं विधि submitNotForm() लिख सकते हैं और जाँच:

2.1: यदि कोई सेवा कॉल है, यह कॉल के लिए करने के लिए "viewLoginForm" और मान मैं साख

के लिए अनुरोध सेट से पैरामीटर प्राप्त

2.2: सब कुछ एक ही विधि प्रस्तुत

यह मेरे लिए काम करते हो और कुछ!

संबंधित मुद्दे