블로그 이미지
올해목표 // 10월 어학연수 떠나자~ 자수씨

카테고리

전체글 (1457)
Brand New! (28)
주절주절 (213)
MOT (11)
해외쇼핑 (49)
쇼핑노트 (150)
취미생활 (94)
iPhone (4)
Eclipse (121)
Google (83)
Spring (31)
JAVA (176)
JavaScript (59)
WEB (49)
Database (20)
OS (26)
Tools (8)
Tips (26)
IT정보 (1)
Book (21)
Programming (37)
외부행사 (43)
주변인들 (17)
여행노트 (60)
학교생활 (30)
회사생활 (52)
사회생활 (5)
외국어공부 (12)
잡동사니 (30)
Total
Today
Yesterday
 
04-19 12:12
 

달력

« » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
 

최근에 올라온 글

최근에 달린 댓글


CasValidationFilter 를 Cas20ProxyReceivingTicketValidationFilter 로 테스트 했을 때, principal.getAttributes() 가 null 로 반환되어 어쩔 수 없이 Saml11TicketValidationFilter 를 사용하였습니다.

오늘 CAS Client 설정 메뉴얼을 작성하면서 Cas20ProxyReceivingTicketValidationFilter 로 설정하도록 한 것 때문에 같이 연동을 했던 분이 attributes 를 가지고 올 수 없었습니다.
당근 아저씨한테 물어보니 맨 처음 썼던 것 처럼 null 로 반환되는 문제 때문에 SAML로 하셨다고 하네요...

혹시 무언가 방법이 있을 것 같아 찾아보니 아래와 같은 방법이 있었습니다.

http://www.ja-sig.org/issues/browse/CAS-655

위의 방법은 CAS Server 의 /WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp 파일을 수정하는 것이었습니다.
<%@ page pageEncoding="UTF-8"%><%@ page session="false" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %><cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
 <cas:authenticationSuccess>
  <cas:user>${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}</cas:user>
  <cas:attributes>
   <c:forEach var="attr"
    items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"
    varStatus="loopStatus" begin="0"
    end="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes)-1}"
    step="1"><cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
   </c:forEach>
  </cas:attributes>

<c:if test="${not empty pgtIou}">
  <cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>
</c:if>
<c:if test="${fn:length(assertion.chainedAuthentications) > 1}">
  <cas:proxies>
<c:forEach var="proxy" items="${assertion.chainedAuthentications}" varStatus="loopStatus" begin="0" end="${fn:length(assertion.chainedAuthentications)-2}" step="1">
   <cas:proxy>${fn:escapeXml(proxy.principal.id)}</cas:proxy>
</c:forEach>
  </cas:proxies>
</c:if>
 </cas:authenticationSuccess>
</cas:serviceResponse>
해당 파일을 열고 붉은 부분을 추가합니다. pageEncoding 은 해당 서버의 charset 에 맞게 설정합니다.



잘 나오는 것을 확인하였습니다. 일단 CAS 2.0 protocol 을 사용하는 것이 옵션도 많아서 일단은 이걸로 쭉~ 가볼 생각입니다.


Posted by 자수씨
, |
...
<Status><StatusCode Value="samlp:Success"></StatusCode></Status>
...

Response SAML에서는 저런식으로 Success가 나오는데...

javax.servlet.ServletException: org.jasig.cas.client.validation.TicketValidationException: No valid assertions from the SAML response found.
클라이언트에서 로그인할 때 저런 메시지가 나온다면...

CAS 서버나 클라이언트의 시간을 확인해보시면 됩니다.
서버 시간이 클라이언트 시간보다 말도 안되게 느리면 나오는 문제입니다.


지난 번에 당근아저씨가 겪언던 문제라 1시간만 삽질하고 해결!!!


tolerance 가 작게 잡혀 있으면 서버시간 보다 클라이언트 시간이 조금만 느려도... 문제가 발생하네요...

쩝;;;


Posted by 자수씨
, |

http://www.ja-sig.org/downloads/cas-clients/php/ 에서 최신버전 phpCAS 모듈을 내려받습니다.

CAS-[버전] 디렉토리 밑에 CAS, docs 디렉토리와 CAS.php 파일을 해당 php 프로젝트 루트에 붙여넣습니다.

include 페이지 수정

해당 로직을 include 페이지 상단에 삽입합니다. (서버 설정에 따라 붉은 볼드 부분은 변경될 수 있습니다.)

<?php

 

//

// phpCAS simple client

//

 

// import phpCAS lib

include_once('CAS.php');

 

phpCAS::setDebug();

 

// initialize phpCAS

phpCAS::client(CAS_VERSION_2_0,'sso-cas.univ-rennes1.fr',443,'');

 

// no SSL validation for the CAS server

phpCAS::setNoCasServerValidation();

 

// force CAS authentication

phpCAS::forceAuthentication();

 

// at this step, the user has been authenticated by the CAS server

// and the user's login name can be read with phpCAS::getUser().

 

// logout if desired

if (isset($_REQUEST['logout'])) {

        phpCAS::logout();

}

 

// for this test, simply print that the authentication was successfull

?>


Web Application
을 재 시작하여 CAS Login 페이지가 나오게 되면 정상입니다.

참고자료: http://www.ja-sig.org/wiki/display/CASC/phpCAS



Posted by 자수씨
, |

https://sourcesup.cru.fr/projects/cas4net 에서 casModule을 다운받습니다.

압축을 풀고 casModule.dll 파일을 어플리케이션의 bin 디렉토리에 casModule.dll 파일을 붙여 넣습니다.


CAS Server에 대한 URL을 설정합니다.

<appSettings>

        <add key="loginUrl" value="https://cas.server/login" />

        <add key="validateUrl" value="https://cas.server/serviceValidate" />

        <add key="logoutUrl" value="https://cas.server/logout" />

</appSettings>

‘CasModule’ httpModule  system.web 섹션 내부에 추가합니다.

<system.web>

        ...

        <httpModules>

               <add name="CasModule" type="Upmc.CasModule.CasModule, CasModule"/>

        </httpModules>

        ...

</system.web>

system.web 섹션에 인증과 권한을 설정합니다.

<system.web>

        ...

        <authentication mode="None">

        </authentication>

        <authorization>

               <allow users="*"/>

        </authorization>

        ...

</system.web>

Web Application을 재 시작하여 CAS Login 페이지가 나오게 되면 정상입니다.


참고자료: http://www.ja-sig.org/wiki/display/CASC/.Net+Http+module


Posted by 자수씨
, |

아래 사이트에서 최신버전 CAS Client를 다운받습니다.

http://www.ja-sig.org/downloads/cas-clients/cas-client-3.1.10-release.zip

다운 받은 라이브러리에서 /modules 디렉토리에 있는 jar 파일들을 /WEB-INF/lib 에 배포합니다.

web.xml 수정

Web application web.xml에 다음과 같은 servlet-filter를 추가합니다.

<!-- CAS:START - Java Client Filters -->

<filter>

   <filter-name>CasSingleSignOutFilter</filter-name>

   <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>

</filter>

<filter>

  <filter-name>CasAuthenticationFilter</filter-name>

  <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>

  <init-param>

    <param-name>casServerLoginUrl</param-name>

    <param-value>https://cas.institution.edu/cas/login</param-value>

  </init-param>

  <init-param>

    <param-name>serverName</param-name>

    <param-value>https://jira.institution.edu/jira/</param-value>

  </init-param>

</filter>

<filter>

    <filter-name>CasValidationFilter</filter-name>

    <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>

    <init-param>

        <param-name>casServerUrlPrefix</param-name>

        <param-value>https://cas.institution.edu/cas</param-value>

    </init-param>

    <init-param>

        <param-name>serverName</param-name>

        <param-value>https://jira.institution.edu/jira/</param-value>

    </init-param>

    <init-param>

        <param-name>redirectAfterValidation</param-name>

        <param-value>true</param-value>

    </init-param>

</filter>

<!--- CAS:END -->

     붉은 색 볼드 형식은 추후 설정에 따라 바뀔 수 있습니다.

servlet-filter mapping이 되는 filter-mapping을 추가합니다.

해당 Web application의 시작 페이지가 /login.jsp라면 아래와 같이 설정을 합니다.

<!-- CAS:START - Java Client Filter Mappings -->

<filter-mapping>

   <filter-name>CasSingleSignOutFilter</filter-name>

   <url-pattern>/*</url-pattern>

</filter-mapping>

<filter-mapping>

    <filter-name>CasAuthenticationFilter</filter-name>

    <url-pattern>/login.jsp</url-pattern>

</filter-mapping>

<filter-mapping>

    <filter-name>CasValidationFilter</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

<!-- CAS:END -->

Single Sign Out listener를 추가합니다.

<!-- CAS:START - Java Client Single Sign Out Listener -->

<listener>

    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>

</listener>

<!-- CAS:END -->

Web Application을 재 시작하여 CAS Login 페이지가 나오게 되면 정상입니다.


참고자료: http://www.ja-sig.org/wiki/display/CASC/CAS+Client+for+Java+3.1

 

 

Posted by 자수씨
, |

생전에 접해볼 생각도 안해봤던 서블릿 필터를 CAS를 하면서 만들게 되었습니다.

구조는 replacementLoginUrl과 casServerLoginUrl를 init-param으로 받고 casServerLoginUrl을 HttpClient로 연결을 해봐서 문제가 없으면 filterChain으로 계속 처리를 하고 아니면 replacementLoginUrl 페이지로 리다이렉트 시킵니다.



중요한 것은 web.xml에서 CasAuthenticationFilter 보다 위에 정의를 해야 한다는 점입니다.
아래에 해버리면 아무 의미가 없어져 버린다는...


CAS 전문가 과정 자체 이수 중...

 


Posted by 자수씨
, |





그냥 이것도 이해를 하기 위해서 그려 놓은 것 입니다.

SpringIDE에서 위의 다이어그램을 그려주지 않을까 해서 설치해봤는데 못찾아서 ㅋㅋ 그냥 예전에 그려놓은걸 올려요~





Posted by 자수씨
, |

CAS Client는 WAS의 web.xml에 filter설정에 의하여 동작을 하게됩니다.
역시 구축 시에 정리해 놓는 것이 좋을 듯하여 슥삭슥삭... (물론 틀릴 가능성은 많습니다 ㅋㅋㅋ)




참고 페이지: http://www.ja-sig.org/wiki/display/CASC/Configuring+the+JA-SIG+CAS+Client+for+Java+in+the+web.xml





Posted by 자수씨
, |

cas server 에서 jdbc 를 담당하는 클래스는 아래와 같이 네 종류가 있습니다.



ㅁ AbstractJdbcUsernamePasswordAuthenticationHandler
- 데이터베이스 인증 핸들러에 대한 추상 클래스.

ㅁ BindModeSearchDatabaseAuthenticationHandler
- 제공된 사용자 이름 및 암호를 사용하여 데이터베이스에 대한 연결을 열어 사용자 인증을 시도.
서버는 URL을 키로 갖고, 필요로하는 데이터베이스 드라이버의 타입을 프로퍼티로 갖는 Properties와 같은 클래스를 제공.

ㅁ QueryDatabaseAuthenticationHandler
- 사용자 이름을 파라미터로 한 쿼리에 의해 리턴된 패스워드는 사용자에 의해 제공된 패스워드의 변환된 버전과 비교되어 짐.
일치 한다면 인증은 성공. 기본 암호 변역기는 일반텍스트 번역기. (???)

ㅁ SearchModeSearchDatabaseAuthenticationHandler
- 사용자 이름과 패스워드에 사용된 암호화 방식을 조회하는 핸들러 (???) 
이 클래스의 기본적으로 PlainTextPAsswordTranslator의 PasswordTranslator.


JavaDoc에 있는 걸 해석해보려고 해도 써보질 않았으니 무슨 말인지 모르겠네요.

일단은 정리!!!



Posted by 자수씨
, |

jaas.conf 관련 실패 로그
-------------------------------------------------------------------------------
Test set: org.jasig.cas.authentication.handler.support.JaasAuthenticationHandlerTests
-------------------------------------------------------------------------------
Tests run: 4, Failures: 0, Errors: 4, Skipped: 0, Time elapsed: 0.202 sec <<< FAILURE!
testWithAlternativeRealm(org.jasig.cas.authentication.handler.support.JaasAuthenticationHandlerTests)  Time elapsed: 0.171 sec  <<< ERROR!
java.lang.SecurityException: ...\cas-server-3.3.5\cas-server-core/src/test/resources/org/jasig/cas/authentication/handler/support/jaas.conf (해당 파일이나 디렉토리가 없습니다.)

GoogleAccountsService 관련 실패 로그
-------------------------------------------------------------------------------
Test set: org.jasig.cas.authentication.principal.GoogleAccountsServiceTests
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.016 sec <<< FAILURE!
testResponse(org.jasig.cas.authentication.principal.GoogleAccountsServiceTests)  Time elapsed: 0 sec  <<< ERROR!
java.io.FileNotFoundException: class path resource [DSAPublicKey01.key] cannot be opened because it does not exist

GoogleAccountsArgumentsExtractor 관련 실패 로그
-------------------------------------------------------------------------------
Test set: org.jasig.cas.web.support.GoogleAccountsArgumentExtractorTests
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0 sec <<< FAILURE!
testNoService(org.jasig.cas.web.support.GoogleAccountsArgumentExtractorTests)  Time elapsed: 0 sec  <<< ERROR!
java.io.FileNotFoundException: class path resource [DSAPublicKey01.key] cannot be opened because it does not exist


위의 문제들 모두다 어떤 파일들이 없다는 것 입니다. 보아하니 인증서 관련 문제인 것 같았습니다. 하지만 아무리 구글을 뒤져봐도 나오지 않는 해결책으로 인하여 결국 CAS 소스 서버를 뒤지게 되었습니다.




이제 war도 나왔으니... 배포 테스트를...



Posted by 자수씨
, |

글 보관함

최근에 받은 트랙백