SSO 로그온 UI 구성하기

로그온 UI는 사용자가 인증되어 있지 않는 상태로 로그온을 수행할 수 있도록 UI를 제공해야 합니다.

로그온 UI는 사용자의 자격증명(Credential)을 입력할 수 있도록 구성됩니다.

보통은 사용자 아이디와 비밀번호가 대부분 입니다. 샘플로 제공하는 UI 구성은 다음과 같습니다.

파일명

설명

Logon.aspx, cs

일반적인 방식으로 사용자 아이디, 비밀번호를 입력할 수 있는 UI 샘플

LogonEnc.aspx, cs

Logon.cshtml과 전반적으로 동일하나 비밀번호 암호화 처리가 추가된 UI 샘플

LogonTFA.aspx, cs

2-Factor 인증 사용시 1단계 인증 방식(사용자 자격증명 입력과 보안코드를 함께 입력)의 UI 샘플

샘플코드

Logon.aspx.cs
using NETS.SSO.Client;
using NETS.SSO.Client.AuthCheck;
using NETS.SSO.Client.Common;
using NETS.SSO.Client.Configuration;
using System;
using System.Threading;
 
public partial class Logon : System.Web.UI.Page
{
    // 태그 이름들: SSO 서버에 데이터를 전달할 때, 
    // 그 파라미터 이름을 통일 시키기 위하여 태그명을 정책으로 관리합니다.
    protected string uidTagName = string.Empty;         // 사용자 아이디 태그명
    protected string pwdTagName = string.Empty;         // 사용자 비밀번호 태그명
    protected string credTypeTagName = string.Empty;    // 자격증명 종류 태그명
    protected string returnURLTagName = string.Empty;   // 리턴 URL 태그명
    protected string siteTagName = string.Empty;        // 사이트 식별자 태그명
 
    protected string errorCode = string.Empty;          // 에러 코드
    protected string errorMessage = string.Empty;       // 에러 메시지
 
    protected string siteID = string.Empty;             // 사이트 식별자
    protected string logonUrl = string.Empty;           // 로그온 URL
    protected string returnUrl = string.Empty;          // 리턴 URL
    protected string ssoCheckUrl = string.Empty;        // SSO 인증 체크 URL (로그온 페이지 용도)
 
    protected void Page_Load(object sender, EventArgs e)
    {
        // SERVER_NAME 값을 기준으로, SSO 정책 정보를 로드합니다.
        // SERVER_NAME 값은 WAS에 전달된 도메인 이름 값이다. (주로 사용자가 입력한 도메인 값)
        string servername = Request.ServerVariables["SERVER_NAME"]; 
        SSOProvider ssoProvider = SSOConfig.Instance.GetCurrentSSOProvider(servername);
        SSOSite ssoSite = ssoProvider.GetCurrentSSOSite(servername);
 
        // 각 태그명 설정
        uidTagName = ssoProvider.GetParamName(ParamInfo.USER_ID);
        pwdTagName = ssoProvider.GetParamName(ParamInfo.USER_PW);
        credTypeTagName = ssoProvider.GetParamName(ParamInfo.CRED_TYPE);
        returnURLTagName = ssoProvider.GetParamName(ParamInfo.RETURN_URL);
        siteTagName = ssoProvider.GetParamName(ParamInfo.SITE_ID);
 
        try
        {
            // 정책 변경 체크 (코드 제거 하면 안됨)
            // SSO 서버에서 정책을 새로 배포 했을 경우, 변경을 감지하여 정책을 다시 받아오도록 하는 코드
            string policyVersion = Utility.GetRequestValue(Request.Form, "policyVersion", string.Empty);
            if (!string.IsNullOrEmpty(policyVersion) && Int32.Parse(policyVersion) > ssoProvider.SSOPolicyVersion)
            {
                SSOConfig.Reloading = false;
                SSOConfig.Instance.Reload();
 
                ssoProvider = SSOConfig.Instance.GetCurrentSSOProvider(servername);
                ssoSite = ssoProvider.GetCurrentSSOSite(servername);
            } 
            // 인증 객체 선언(Request와 Response 인계)
            AuthCheck auth = new AuthCheck(Request, Response);
            // 인증 체크(인증 상태 값 리턴)
            AuthStatus status = auth.CheckLogon();
            // 인증 체크 후 상세 에러코드 조회
            errorCode = auth.ErrorCode.ToString();
 
            // 인증 상태 별 처리
            if (status == AuthStatus.SSOSuccess)
            {
                // ---------------------------------------------------------------------
                // 인증 상태: 인증 성공
                // - 인증 토큰(쿠키) 존재하고, 토큰 형식에 맞고, SSO 정책 체크 결과 유효함.
                // --------------------------------------------------------------------- 
                // 로그온 UI 페이지가 아닌 업무 페이지로 이동 시킴
                Response.Redirect("./Default.aspx");    
            }
            else if (status == AuthStatus.SSOUnAvailable)
            {
                // ---------------------------------------------------------------------
                // 인증 상태 : 인증 실패 또는 로그오프 상태
                // - 인증 오류 발생 또는 로그온 하지 않은 로그오프 상태
                // --------------------------------------------------------------------- 
                // SSO 장애 시 정책에 따라 자체 로그인 페이지로 이동 시키거나, SSO 인증을 위한 포탈 로그인 페이지로 이동
                errorMessage = "SSO service is not available now. Please try again in a few minutes.";
            } 
            // 로그온 페이지에서, 인증 서버에 인증 확인하는 스크립트 (HTML의 Header항목에 출력하도록 해야 함)
            // 사용자가 인증을 받았다면, 인증을 수행하도록 Javascript가 동작.
            // 사용자가 인증을 받지 않았다면, 아무런 동작도 없음.
            ssoCheckUrl = auth.GetTrySSOScript();
        }
        catch (AgentException aex)
        {
            Response.Write(aex.ToString());
        }
        catch (ThreadAbortException)
        {  }
         // 리턴 URL 설정 (인증 후 되돌아 올 URL)
        // 로그온 UI 페이지로 전달된 리턴 URL 값 조회
        returnUrl = Request[returnURLTagName];
        // 전달된 리턴 URL 값 존재 여부 확인
        if (string.IsNullOrEmpty(returnUrl))
        {
            // 리턴 URL 값이 전달되지 않았다면, 기본 URL을 그 값으로 설정
            returnUrl = ssoSite.GetDefaultReturnUrl(Request);
            if (string.IsNullOrEmpty(returnUrl))
            {
                // 기본 URL이 없을 경우. 현재 URL을 리턴 URL로 설정(이 부분은 필요 시 수정. ThisURL을 사용해도 무방)
                returnUrl = Request.Url.AbsoluteUri;
            }
        } 
        // 사이트 식별자 설정
        // 로그온 UI 페이지로 전달된 사이트 식별자 조회
        siteID = Request[siteTagName];
        if(string.IsNullOrEmpty(siteID))
            siteID = ssoSite.ID;    // 전달된 식별자가 없으면, 현재 사이트 식별자를 사용 
        // 사용자 계정을 SSO에 전달할 인증 서버의 로그온 URL 설정
        logonUrl = ssoSite.GetLogonUrl(Request);
    }
}

Last updated

Was this helpful?