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

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

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

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

선입자에 대한 처리는 AuthCheck의 CheckLogon의 결과 값이 AuthStatus.SSOFail 이고 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>

Last updated

Was this helpful?