現在完成的系統已經有使用者帳密驗證的機制

本來想把AD驗證功能擺在最後再完成

現在公司的AD驗證我也是第一次遇見

囧 前公司沒有這玩意兒

好在今天心血來潮之下

尋求Google大師幫忙

在眾多網友的分享下

我也成功完成這項功能

所以將過程記錄下來

 

首先是IIS環境

因為Win7 的IIS必須自己選裝

之前在架設時並沒有另外對"安全性"選項做調整

所以若要使用AD驗證

必須要打開Windows驗證

(亦有網友提議開啟基本驗證功能,這兩者需再研究一下)

php範例的IIS安全性設定解說

解決 IIS 權限問題的指導方針

ASP.NET 網站採用整合式 Windows 驗證的注意事項

 驗證1

待安裝完成後

進入IIS查看網站的驗證選項

驗證2

驗證3

按照網友說明

奇怪,真的沒有人會以ASP程式驗證AD帳號的密碼嗎? (藍色小舖)

應該將Windows 驗證設定為啟用才可以

但是當我尚未設定啟用時

直接連線公司內部網路

即可透過AD帳號正確登入

這點可能還需要爬文才知道

 

以下是關於ASP程式碼設定部分

參考下列幾位網友的分享

跨網域認證AD

網站登錄可否與AD做結合??

然後整理完以後

我將上述程式碼與自己網站現有的USER資料庫做結合

因為USER資料庫中友一些權限等相關設定

必須要先在USER資料庫裡設定存放AD帳號的資料欄位

<%
response.buffer = true
Dim MM_editQuery
Dim MM_editCmd
Dim strUsername,strpassword,domainname
Dim objDomain,objADsPath,objConnection,objCommand,objRS

MM_LoginAction = Request.ServerVariables("URL")
strUsername=CStr(Request.Form("u_id"))  '這邊讀取登入的使用者AD帳號
strpassword=CStr(Request.Form("u_pwd")) '這邊讀取登入的使用者AD密碼
domainname="網域名稱 " '這邊輸入網域名稱 

If strUsername <> "" AND strpassword <> "" Then
 
        '以下為網友提供程式碼,直接全部引用
        on error resume next


        Set objDomain = GetObject ("GC://rootDSE")
        objADsPath = objDomain.Get("defaultNamingContext")
        Set objDomain = Nothing
        Set objConnection = Server.CreateObject("ADODB.Connection")
        objConnection.provider ="ADsDSOObject"
        objConnection.Properties("User ID") = domainname+"\"+strUsername
        objConnection.Properties("Password") = strpassword
        objConnection.open "Active Directory Provider"
        Set objCommand = CreateObject("ADODB.Command")
        Set objCommand.ActiveConnection = objConnection
        objCommand.CommandText ="select cn FROM 'GC://"+objADsPath+"' where sAMAccountname='"+strUsername+"'"
        Set objRS = objCommand.Execute

        'HandleError
        If Err.Number = 0 Then
            Response.Write "AUTHENTICATED!" '登入成功
            MM_flag="ADODB.Recordset"
            set MM_rsUser = Server.CreateObject(MM_flag) 
            MM_rsUser.ActiveConnection = MM_conn_STRING '連接資料庫
            MM_rsUser.Source = "SELECT * FROM USER WHERE u_id='"&strUsername&"'" '連接網站的user資料庫抓取相關設定資料
            MM_rsUser.CursorType = 0 
            MM_rsUser.CursorLocation = 2
            MM_rsUser.LockType = 3 
            MM_rsUser.Open
      
            If Not MM_rsUser.EOF Or Not MM_rsUser.BOF Then 
                ' username and password match - this is a valid user
                Session("MM_u_num") =  MM_rsUser("u_num") 'user資料庫抓取相關設定資料
                Session("MM_Username") =  strUsername
                Session("MM_Userright") = MM_rsUser("u_right")
            
            MM_rsUser.Close
            Response.Redirect("main.asp") '直接進入網站主頁
            End If
        
        else
        Response.Write "Logon failed."    '登入失敗
        MM_rsUser.Close
        response.write "<script language=javascript> alert('Logon failed. User id or Password Error!!'); </script>"  '登入失敗,跳出警告訊息
        End if
End If
%>

因為考慮到有些使用者並無AD帳密

所以這邊再加入判斷式

將這些使用者命名為Loacal使用者

區別Local使用者與AD使用者做不同判斷登入方式

<%
If strUsername <> "" AND strpassword <> "" Then

'另外加入的Local使用者判斷方式------------------------------------------------Start---
Dim Recordset1
Dim Repeat1__numRows
Dim Repeat1__index

Set Recordset1 = Server.CreateObject("ADODB.Recordset")
Recordset1.ActiveConnection = MM_conn_STRING
Recordset1.Source = "SELECT * FROM USER WHERE Strcomp(u_id,'" & Replace(strUsername,"'","''") &"',0)=0 AND Strcomp(u_pwd,'" & Replace(strpassword,"'","''") & "',0)=0 and u_path='Local'"
Recordset1.CursorType = 0
Recordset1.CursorLocation = 2
Recordset1.LockType = 3
Recordset1.Open()

    If Not Recordset1.EOF Or Not Recordset1.BOF Then  '登入成功
    
        ' username and password match - this is a valid user
        Session("MM_u_num") =  Recordset1("u_num")'user資料庫抓取相關設定資料
        Session("MM_Username") =  strUsername
        Session("MM_Userright") = Recordset1("u_right")
        
        
        Recordset1.Close
        Response.Redirect("main.asp")'直接進入網站主頁
'另外加入的Local使用者判斷方式------------------------------------------------End-----        
    
    Else
    
'AD使用者判斷方式------------------------------------------------Start---
        
        '以下為網友提供程式碼,直接全部引用
        on error resume next


        Set objDomain = GetObject ("GC://rootDSE")
        objADsPath = objDomain.Get("defaultNamingContext")
        Set objDomain = Nothing
        Set objConnection = Server.CreateObject("ADODB.Connection")
        objConnection.provider ="ADsDSOObject"
        objConnection.Properties("User ID") = domainname+"\"+strUsername
        objConnection.Properties("Password") = strpassword
        objConnection.open "Active Directory Provider"
        Set objCommand = CreateObject("ADODB.Command")
        Set objCommand.ActiveConnection = objConnection
        objCommand.CommandText ="select cn FROM 'GC://"+objADsPath+"' where sAMAccountname='"+strUsername+"'"
        Set objRS = objCommand.Execute

        'HandleError
        If Err.Number = 0 Then
            Response.Write "AUTHENTICATED!" '登入成功
            MM_flag="ADODB.Recordset"
            set MM_rsUser = Server.CreateObject(MM_flag) 
            MM_rsUser.ActiveConnection = MM_conn_STRING '連接資料庫
            MM_rsUser.Source = "SELECT * FROM USER WHERE u_id='"&strUsername&"'" '連接網站的user資料庫抓取相關設定資料
            MM_rsUser.CursorType = 0 
            MM_rsUser.CursorLocation = 2
            MM_rsUser.LockType = 3 
            MM_rsUser.Open
      
            If Not MM_rsUser.EOF Or Not MM_rsUser.BOF Then 
                ' username and password match - this is a valid user
                Session("MM_u_num") =  MM_rsUser("u_num") 'user資料庫抓取相關設定資料
                Session("MM_Username") =  strUsername
                Session("MM_Userright") = MM_rsUser("u_right")
            
            MM_rsUser.Close
            Response.Redirect("main.asp") '直接進入網站主頁
            End If
        
        else
        Response.Write "Logon failed."    '登入失敗
        MM_rsUser.Close
        response.write "<script language=javascript> alert('Logon failed. User id or Password Error!!'); </script>"  '登入失敗,跳出警告訊息
        End if
    End if
'AD使用者判斷方式------------------------------------------------End-----    
End If
%>

以上是將目前的USER資料庫與AD帳密結合的過程

目前為止使用上沒問題!

mayfis 發表在 痞客邦 PIXNET 留言(0) 人氣()