Translate

2015년 4월 5일 일요일

[ADSI][ASP] Creating a Windows user account to Sign Up on a website.(web page)


제목: 웹페이지에서 회원가입으로 윈도우 사용자 계정 생성하기.
(어차피 국내에선 이 글이 크게 도움이 될 것 같지 않아서 외국유입률 올리기 위해 제목을 영어로 작성을 했다.)

학생 시절에 Windows Server 를 이용해서 AD(Active Directory) 구축해서 Terminal 서버를 운영한적이 있었는데 이게 사용자들의 계정을 수동으로 일일히 만들어 줘야 하는 단점이 있었다.

사용자 계정을 자주 만들어야 하는건 아니었지만 사용자에게 아이디와 패스워드를 받아야 하는 불편함이 있어서 인터넷으로 회원가입을 하는 방법을 찾던중에 ADSI (Active Directory Service Interfaces) 라는 기술이 있어서 공부해서 만들었던적이 있었다.


학교 졸업당시 해당 작업을 이력서에 기술하고 포트폴리오도 만들어 놨었는데..
이제는 경력도 쌓이고 더 이상 해당 작업을 포트폴리오 로써 사용할 수 없을 것 같아 여기에 기술한다.






기능
- 아래의 페이지에서 회원가입 시 Windows Server의 사용자 계정이 생성된다.




준비
1. Windows Server 가 필요하다.
2. IIS 서비스가 구성되어있어야 한다.
3. Active Directory 서비스가 구성되어있어야 한다.

PS. 아래의 소스를 IIS 에 셋팅된 홈디렉토리에 추가한다.



소스

CreateUserForm.html

<html>
<head>
<!-- ===== writeer: 1004lucifer ===== -->
<title>회원가입 양식 입니다.</title>
</head>
<body>

<h1>회원 가입 양식</h1>

<form method="post" action="CreateUserProc.asp">
아이디 : <input type="text" name="id" size="16"><br>
비밀번호 : <input type="password" name="pass" size="16"><br><br>
성 : <input type="text" name="lastName" size="10"><br>
이름 : <input type="text" name="firstName" size="10"><br>
E-mail : <input type="text" name="mail" size="20"><br>
연락처 : <input type="text" name="phone" size="20"><br>
핸드폰 : <input type="text" name="mobilePhone" size="20"><br>
<input type="submit" value="가입">
</form>

</body>
</html>




CreateUserProc.asp

<%
'===== writeer: 1004lucifer =====

on error resume next
Const ADS_PROPERTY_APPEND   = 3 'PutEx를 사용하기 위해 존재

'----------------------- 값을 넘겨 받음 -----------------------------
Dim id, pass, lastName, firstName, mail, phone, mobilePhone

id = Request.Form("id")
pass = Request.Form("pass")
lastName = Request.Form("lastName")
firstName = Request.Form("firstName")
mail = Request.Form("mail")
phone = Request.Form("phone")
mobilePhone = Request.Form("phone")
fullName = lastName & " " & firstName
'-------------------------------------------------------------

Domain = "DC=test01,DC=com"  '도메인 이름을 지정함
Container = "CN=Users"   '사용자가 생성될 컨테이너를 지정함(CN 또는 OU)

ADsPath = "LDAP://" & Container & "," & Domain
sUser = id
set connect = GetObject("LDAP:")
set cont = connect.OpenDSObject(ADsPath, "administrator", "password", 1)

Set user = cont.Create("user", "cn="&sUser)

user.put "sAMAccountName", sUser
user.put "displayName" , fullName
user.put "homePhone", phone
user.put "mail", mail
user.put "mobile", mobilePhone
user.put "userPrincipalName", sUser
user.put "userAccountControl", "544" '(계정 사용안함)옵션 취소하기위해 플래그비트값 변경
user.put "pwdLastSet", "-1"    '(다음 로그인할때 반드시 암호번경)옵션 취소
user.SetInfo
if (Err.number <> 0) then
 Response.Write "사용자가 이미 있습니다."
 Response.End 
end if

user.ChangePassword "", pass
user.SetInfo


groupADsPath = "LDAP://CN=Users,CN=Builtin,DC=test01,DC=com" '소속될 그룹ADsPath를 지정
userADsPath = "CN=" & sUser & "," & Container & "," & Domain 

set connect = GetObject("LDAP:")
set cont = connect.OpenDSObject(groupADsPath, "administrator", "password", 1)

cont.PutEx ADS_PROPERTY_APPEND, "member", Array(userADsPath)
cont.SetInfo
if (Err.number <> 0) then
 Response.Write "사용자는 생성되었으나 그룹이 존재하지 않아서 그룹에 포함시키지 못했습니다."
 Response.End 
end if
%>







ADlogin.asp

<%
'===== writeer: 1004lucifer =====

computerName = "win2003server01" '컴퓨터 이름 설정 부분
domainName = "DC=test01,DC=com"  '도메인 이름 설정 부분
groupName = "CN=Administrators,CN=Builtin" 
'그룹 이름 설정 부분 ex) "CN=남자직원,OU=인사과" 등등..

ADsPath = "LDAP://" & computerName & "/" & groupName & "," & domainName

logonUser = Request.ServerVariables("LOGON_USER")

If logonUser = "" Then
    Response.Status = "401 Authorization Required"
    Response.End
End If

STR_IS_AUTH    = UCase(Trim(Request.Cookies("AUTH"))) 
IsLegal        = False     '권한 저장

If STR_IS_AUTH <> "TRUE" Then
    '도메인을 제거한 아이디문자열만 얻는다
    aryTemp = Split(logonUser, "\")
    logonUser = aryTemp(UBound(aryTemp))

    Set oAuthADsGroup = GetObject(ADsPath)
    For Each user In oAuthADsGroup.GetEx("Member")
 '---아이디 문자열만 얻는다-----
 user = trim(user)
 strTemp = split(user, ",")
 user = strTemp(0)
 length = len(user)
 user = right(user, length-3)
 '-------------------------------
        If UCase(user) = UCase(logonUser) Then
            Response.Cookies("AUTH") = "TRUE"
            IsLegal = True
            Exit For
        End If
    Next
    Set oAuthADsGroup = Nothing

    If IsLegal = False Then
        Response.Redirect "index.asp" '로그인 실패했을때 다른 페이지로 보낸다.  
    End If  
End If

response.write "성공적으로 로그인 되었습니다."
%>





PS.
거의 10년전쯤에 만든거 같은데..
마지막의 ADlogin.asp 파일은 왜 만들었던 거였더라??
로그인은 '원격데스크톱(mstsc)' 로 하는거였는데 말이지..

직접 실행하지 않으면 잘 모르겠다;;


댓글 없음 :

댓글 쓰기