SSO Guide 4 Dev.
  • MOIN SSO 소개
  • SSO 기술의 이해
  • SSO의 동작과 이해
    • 로그온
    • 로그오프
    • 로그온 실패
    • 중복 로그온
    • 2-Factor 인증
    • SSO 세션 탈취 검사
  • 개발 시작하기
    • 업무시스템 정보 전달
    • 라이브러리 다운로드
    • 라이브러리 적용
    • Agent 환경 설정 파일 수정
    • 인증확인과 인증상태에 따른 처리 방법
    • 통합 인증 페이지 이용하기
    • 로그온 UI 개발
    • SSO 로그오프 방법 제공
  • 개발하기
    • .NET
      • SSO 로그온 UI 구성하기
      • 업무 시스템 로그온 로직 구현하기
      • SSO 로그온 에러 처리 로직 구현하기
      • SSO 세션 탈취 검사하기
      • SSO 로그오프 방법 제공하기
      • 업무 시스템 로그오프 로직 구현하기
      • SSO 중복 로그온 선택 UI 구성하기
    • .NET MVC
      • SSO 로그온 UI 구성하기
      • 업무 시스템 로그온 로직 구현하기
      • SSO 로그온 에러 처리 로직 구현하기
      • 세션 탈취 검사하기
      • 로그오프 방법 제공하기
      • 업무 시스템 로그오프 로직 구현하기
      • SSO 중복 로그온 선택 UI 구성하기
    • JAVA
      • SSO 로그온 UI 구성하기
      • 업무 시스템 로그온 로직 구현하기
      • SSO 로그온 에러 처리 로직 구현하기
      • 세션 탈취 검사하기
      • SSO 로그오프 방법 제공하기
      • 업무 시스템 로그오프 로직 구현하기
      • SSO 중복 로그온 선택 UI 구성하기
    • SPA(Single Page Application)
      • Agent Library 명세
      • Agent 환경 구성하기
      • SSO 로그온 UI 구성하기
      • 업무 시스템 로그온 로직 구현하기
      • SSO 로그온 에러 처리 로직 구현
      • SSO 세션 탈취 검사하기
      • SSO 로그오프 방법 제공하기
      • 업무 시스템 로그오프 로직 구현하기
      • SSO 중복 로그온 선택 UI 구성하기
  • 주요 클래스
    • AuthCheck(.NET)
    • AuthCheck(.NET MVC)
    • AuthCheck(Java)
    • AuthStatus
  • 개발 테스트
  • SSO 오류코드
  • 갱신 이력
  • Trouble Shooting
  • Known Issues
  • Help Center
Powered by GitBook
On this page

Was this helpful?

  1. 개발하기
  2. .NET

SSO 중복 로그온 선택 UI 구성하기

Previous업무 시스템 로그오프 로직 구현하기Next.NET MVC

Last updated 5 years ago

Was this helpful?

중복 로그온 정책을 사용하면 먼저 인증 받은 사람(선입자)에 대한 처리와 나중에 로그인 하는 사람(후입자)에 대한 처리를 해야 합니다.

선입자에게는 후입자가 로그온을 요청한 시간, IP 정보를 표시할 수 있습니다.

후입에게는 로그온 시 선입자가 있고 선입자의 인증 세션 정보를 무효화 시키고 로그온 할 것인지 선택할 수 있는 페이지로 이동되게 할 수 있습니다.

선입자에 대한 처리는 의 결과 값이 이고 ErrorCode를 확인해서 후입자에 의해 인증 세션이 무효화 됐다는 오류코드가 발생하면 페이지에 표시할 수 있는 처리를 합니다.

샘플코드

// 인증 객체 선언(Request와 Response 인계)
AuthCheck authCheck = new AuthCheck(Page.Request, Page.Response);

// 인증 체크(인증 상태 값 리턴)
AuthStatus status = authCheck.CheckLogon();
if (status == AuthStatus.SSOFail)
{
 if (authCheck.ErrorCode == (int)AgentExceptionCode.SessionDuplicationCheckedLastPriority) 
errorMessage = "Session was invalidated due to duplicated logon.\nIP:" + 
authCheck.DuplicationIP + "\nTime:" + authCheck.DuplicationTime;
}

후입자에 대한 처리는 로그온 요청 시 중복 로그온이 발생했을 때 이동되는 페이지인 DupChoice.aspx에서 합니다. 샘플 코드는 다음과 같습니다.

DupChoice.aspx.cs
protected string DuplicatedInfo = string.Empty;
protected string timeoutMinutes = string.Empty;
protected string dupUserID = string.Empty;
protected string dupIP = string.Empty;
protected string dupTime = string.Empty;
protected string ssoRequestString = string.Empty;
 
protected void Page_Load(object sender, EventArgs e)
{
    try
    {
        if (!IsPostBack)
        {
             // 전달받은 데이터 셋팅
             ssoRequestString = Request["ssorequest"]; 
             AuthCheck auth = new AuthCheck(Page.Request, Page.Response); 
             // 전달 받은 파라미터 유효성 확인
             DupCheck dup = new DupCheck(auth);
             // 페이지에 표시하기위한 데이터 정리.
             dupUserID = dup.DupUserID;
             dupIP = dup.DupUserIP;
             dupTime = dup.DupTime;
             timeoutMinutes = dup.TimeoutMinutes; 
             ssorequest.Value = ssoRequestString;
        }
    }
    catch (AgentException aex)
    {
        Response.Write(aex.ToString());
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message + "<br/>" + ex.StackTrace);
    }
}
 
// 예 버튼 처리
protected void btnOK_Click(object sender, EventArgs e)
{
    try
    {
        AuthCheck auth = new AuthCheck(Page.Request, Page.Response); 
        // 전달 받은 파라미터 유효성 확인
        DupCheck dup = new DupCheck(auth); 
        dup.ProcessLogon();
    }
    catch (AgentException aex)
    {
        Response.Write(string.Format("오류코드 : {0}<br/>{1}<p/>", (int)aex.ExceptionCode, aex.ToString()));
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message + "<br/>" + ex.StackTrace);
    }
}

// 아니오 버튼 처리
protected void btnCancel_Click(object sender, EventArgs e)
{
    try
    {
        AuthCheck auth = new AuthCheck(Page.Request, Page.Response); 
        // 전달 받은 파라미터 유효성 확인
        DupCheck dup = new DupCheck(auth); 
        dup.ProcessCancel();
    }
    catch (AgentException aex)
    {
        Response.Write(string.Format("오류코드 : {0}<br/>{1}<p/>", (int)aex.ExceptionCode, aex.ToString()));
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message + "<br/>" + ex.StackTrace);
    }
}

DupChoic.aspx
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
       <title>NETS*SSO Duplication</title>
       <script type="text/javascript">
       function startTimer(duration, display) {
              if (0 == duration) {
                     display.textContent = "limitless";
              } else {
                     var timer = duration, minutes, seconds;
                     setInterval(function () {
                            minutes = parseInt(timer / 60, 10);
                            seconds = parseInt(timer % 60, 10);
                            minutes = minutes < 10 ? "0" + minutes : minutes;
                            seconds = seconds < 10 ? "0" + seconds : seconds;
                            display.textContent = minutes + ":" + seconds;
                            if (--timer < 0) {
                                   timer = duration;
                            }
                     }, 1000);
              }
       }

       function OnInit() {
              var minutes = 60 * <%=timeoutMinutes%>;
              var display = document.querySelector('#time');
              startTimer(minutes, display);
       }
       </script>
</head>
<body onload="OnInit();">
       <form id="form1" runat="server">
              <table border="0">
                     <tr>
                            <td colspan="2">Duplication</td>
                     </tr>
                     <tr>
                            <td>ID : </td>
                            <td><%=dupUserID %></td>
                     </tr>
                     <tr>
                            <td>IP : </td>
                            <td><%=dupIP %></td>
                     </tr>
                     <tr>
                            <td>Time : </td>
                            <td><%=dupTime %></td>
                     </tr>
                     <tr>
                            <td>Select Choice</td>
                            <td>
                                   <input type="button" id="btnOK" value="예" runat="server" onserverclick="btnOK_Click" />
                                   <input type="button" id="btnCancel" value="아니오" runat="server" onserverclick="btnCancel_Click" />
                            </td>
                     </tr>
                     <tr>
                            <td colspan="2">left : <span id="time" /></td>
                     </tr>
              </table>                            
              <input type="hidden" id="ssorequest" runat="server" />
       </form>
</body>
</html>
AuthStatus.SSOFail
AuthCheck의 CheckLogon