SSO 로그온 UI 구성하기

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

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

사용자 아이디와 비밀번호가 일반적입니다. 샘플로 제공하는 UI 구성은 다음과 같습니다.

파일명

설명

Logon.cshtml

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

LogonEnc.cshtml

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

LogonTFA.cshtml

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

[SSO/SSOController.cs] 의 샘플 코드

SSOController.cs
public ActionResult Logon()
{
	// SSO 인증 서버가 Logon 액션 메소드로 리다이렉트할 때 몇가지 정보를 HTTP POST로 전달해 준다.
	// 이 정보는 하기와 같다.
	// ssoSite : 이 정보는 SSO 인증 확인을 요청한 웹 응용 프로그램의 식별자이다.
	// returnURL : 이 정보는 SSO 인증을 완료한 후에 최종적으로 사용자에 제공할 웹 응용 프로그램의 URL이다.
	// policyVersion : 이 정보는 SSO 인증 서버가 사용하고 있는 인증 정책의 버전 번호이다. 만약에 이 웹 응용 프로그램이 
	// 사용하고 있는 인증 정책 버전과 policyVersion이 다를 경우에, 이 웹 응용 프로그램의 인증 정책을 초기화 해야 한다.
	// 또한 ssoSite와 returnURL은 이 웹 응용 프로그램과 관련되어 있지 않은 정보가 전달될 수 있다. 따라서 이 두가지 정보는
	// SSO 인증 서버로 부터 받은 정보를 그대로 다시 SSO 인증 서버로 전달해 주어야 한다. 비즈니스 요건에 따라서는 원하는 값으로
	// 변경하여 전송하는 것은 가능하지만, 가급적 전달된 정보를 변경하지 않고 그대로 사용할 것을 권장한다.
				
	// 이미 사용자가 SSO 인증을 받은 상태에서, 로그온 UI를 요청할 경우를 대비해서 SSO 인증 확인을 한다.
	AuthCheck authCheck = new AuthCheck(Request, Response);
	AuthStatus status = authCheck.CheckLogon();
	if (status == AuthStatus.SSOSuccess)
	{
		// 인증 상태 검사에서 성공했기 때문에, 이미 사용자는 인증을 완료한 상태이다. 더 이상 로그온 UI를 제공할 이유가 없기 때문에,
		// 비즈니스 요건에 맞는 URL로 사용자를 이동시킨다.
		// 이 샘플에서는 Home/Index로 이동시킨다.
		return RedirectToAction("Index", "Home");
	}
	else if (status == AuthStatus.SSOUnAvailable)
	{
		// 인증 상태 검사 결과가 SSO 인증 서버가 서비스를 제공할 수 없는 상태이다.
		// 이 경우에는 SSO 인증을 서비스 받을 수 없는 상황이기 때문에, 자체적으로 제공하는 로그온 UI를 제공하며, 
		// 사용자에게 웹 응용 프로그램에서 제공하는 서비스를 제공해 주어야 한다.
		// TODO 이곳에 자체 로그온 UI를 제공할 수 있는 코드를 추가한다.
	}


	LogonViewModel model = new LogonViewModel(authCheck.CurrentSSOProvider);
	model.SetPostInfo(authCheck, authCheck.CurrentSSOProvider);

	return View(model);
}

[Views/SSO/Logon.cshtml] 의 샘플 코드

Logon.cshtml
@{
	Layout = null;
}
 
<!DOCTYPE html> 
<html>
<head>
	<meta name="viewport" content="width=device-width" />
	<title>Logon</title>
	@Model.SSOCheckUrl 
	<script type="text/javascript">
		function OnLogon() {
			if (document.forms["frmLogon"].txtUserID.value == "") {
				alert("사용자 ID를 입력하세요");
				document.forms["frmLogon"].txtUserID.focus();
				return;
			}
			if (document.forms["frmLogon"].txtPwd.value == "") {
				alert("사용자의 로그온 비밀번호를 입력하세요");
				document.forms["frmLogon"].txtPwd.focus();
				return;
			}
			document.forms["frmLogon"].target = "_top";
			
			document.forms["frmLogon"].submit();
		}
		function OnLoad() {
			if (document.forms["frmLogon"].txtUserID.value == "") {
				document.forms["frmLogon"].txtUserID.focus();
			} else {
				document.forms["frmLogon"].txtPwd.focus();
			}
		}
	</script> 
</head>
<body>
	<div> 
		<form id="frmLogon" name="frmLogon" method="post" action="@Model.SSOServerLogonUrl">
			<table>
				<tr>
				<td>사용자 ID : </td>			<td><input type="text" id="txtUserID" name="@Model.UserIdTagName" style="width: 150px;" /></td>
				</tr>
				<tr>
				<td>비밀번호 : </td>					<td><input type="password" id="txtPwd" name="@Model.PwdTagName" style="width: 150px;" /></td>
				</tr>
				<tr>					<td colspan="2"><input type="button" id="btnLogon" name="btnLogon" onclick="OnLogon();" value="로그온" /></td>
				</tr>
			</table>
			<input type="hidden" name="@Model.CredTypeTagName" value="BASIC" />
			<input type="hidden" name="@Model.ReturnUrlTagName" value="@Model.ReturnUrl" />
			<input type="hidden" name="@Model.SiteTagName" value="@Model.SiteID" />
		</form>
	</div>
</body>
</html>

Last updated

Was this helpful?