2016-01-28 105 views
0

我正在使用CFLDAP讓用戶使用活動目錄進行身份驗證。我正在嘗試編寫一條if語句,以防用戶信息未經過身份驗證。我想我可以使用<cfif AuthenticateUser.RecordCount gt 0>進行檢查,只要信息是正確的,但是如果輸入了錯誤的信息並且沒有任何驗證,它就不會運行else語句。任何幫助,將不勝感激!如果Else查詢爲空

<cfldap action="query" 
       name="AuthenticateUser" 
       attributes="dn,mail,givenname,sn,samaccountname,memberof" 
       start="DC=domain,DC=net" 
       filter="(&(objectclass=user)(samAccountName=#trim(form.user_name)#))" 
       server="servername" 
       Port="389" 
       username="tc\#trim(form.user_name)#" 
       password="#trim(form.user_pass)#"> 
<cfoutput>#AuthenticateUser.RecordCount#</cfoutput> 
<!--- Get all records from the database that match this users credentials ---> 
<cfquery name="userVerify" datasource="test"> 
    SELECT * 
    FROM dbo.Users 
    WHERE user_name = <cfqueryparam value="#AuthenticateUser.samaccountname#" cfsqltype="cf_sql_varchar" /> 
</cfquery> 
<cfif AuthenticateUser.RecordCount gt 0> 
    <!--- This user has logged in correctly, change the value of the session.allowin value ---> 
    <cfset session.allowin = "True" /> 
    <cfset session.employee_number = userVerify.employee_number /> 

    <!--- Now welcome user and redirect to "index.html" ---> 
    <script> 
     self.location="../dashboard/dashboard.cfm"; 
    </script> 
<cfelse> 
    <!--- this user did not log in correctly, alert and redirect to the login page ---> 
    <script> 
     alert("Your credentials could not be verified, please try again!"); 
     self.location="Javascript:history.go(-1)"; 
    </script> 
    </cfif> 

我也曾嘗試:<cfif len(AuthenticateUser)> enter image description here

+0

當發生這種情況時,AuthenticateUser包含什麼?其他查詢的用途是什麼,即userVerify? – Leigh

+0

當它的身份驗證是抓取所有活動目錄信息時,輸入錯誤的登錄名時,它只是空白。 userVerify基本上將認證名稱與sql數據庫進行匹配,獲取所有用戶信息,如員工編號和全部。許多事情不在活動目錄 –

+0

所以當我輸入正確的用戶名和密碼時,它會繼續並轉到我的控制面板cfm,但是當我輸入錯誤的信息時,我只是得到一個白色屏幕,並且它不顯示任何內容authenticateuser –

回答

1

我想它會在查詢失敗時引發錯誤。試試這個:

<cftry> 
    <cfldap action="query" 
       name="AuthenticateUser" 
       attributes="dn,mail,givenname,sn,samaccountname,memberof" 
       start="DC=domain,DC=net" 
       filter="(&(objectclass=user)(samAccountName=#trim(form.user_name)#))" 
       server="servername" 
       Port="389" 
       username="tc\#trim(form.user_name)#" 
       password="#trim(form.user_pass)#"> 
    <cfset LoginStatus = "Success"> 
    <cfcatch type="any"> 
     <cfset LoginStatus = "Failed"> 
    </cfcatch> 
</cftry> 

然後你CFIF會是這樣的:

<cfif LoginStatus eq "Success"> 
    <!--- This user has logged in correctly, change the value of the session.allowin value ---> 
    <cfset session.allowin = "True" /> 
    <cfset session.employee_number = userVerify.employee_number /> 

    <!--- Now welcome user and redirect to "index.html" ---> 
    <script> 
     self.location="../dashboard/dashboard.cfm"; 
    </script> 
<cfelse> 
    <!--- this user did not log in correctly, alert and redirect to the login page ---> 
    <script> 
     alert("Your credentials could not be verified, please try again!"); 
     self.location="Javascript:history.go(-1)"; 
    </script> 
</cfif> 

我想這樣的作品就CF9。

+0

如果輸入了錯誤的憑證,這也不能正常工作。它確實工作,如果輸入正確的憑據 –

+0

試圖投擲#LoginStatus#在,它只是顯示空白白屏與錯誤的憑據,但顯示成功的正確憑據 –

+0

我沒得到它,我真的沒有大聲笑 –

2

這是一個格式化的評論。你試圖一次做得太多。一次走一步。以此開始:

<cfdump var="before cfldap tag<br />"> 

<cfldap action="query" 
      name="AuthenticateUser" 
etc 
> 
<cfdump var="after cfldap tag<br />"> 
<cfdump var = "#AuthenticateUser#"> 
<cfdump var="after cfdump<br />"> 

使用有效和無效憑據運行此代碼。看看你得到了什麼。相應地做出反應。

+0

同樣的事情發生了錯誤信息空白屏幕,正確的信息顯示dn,givenname,郵件,memberof,samaccountname,sn –

+0

你是說你不要看不到cfdump後面的文本行?嘗試3個cfdumps。 –

+0

所以當我運行正確和不正確的憑據這是所有顯示'之前cfldap標記
' –

2

這就是我的做法。我嘗試使用提供的用戶名和密碼對我們的域運行查詢。如果提供的用戶名和密碼無效,則會生成錯誤。

<cftry> 
    <cfldap action="Query" 
     name="ADResult" 
     attributes="dn" 
     start="DC=domain,DC=net" 
     filter="sAMAccountName=administrator" 
     server="servername" 
     scope = "subtree" 
     username="#arguments.username#" 
     password="#arguments.password#" /> 

    <cfset isAuthenticated = true /> 
<cfcatch type="any"> 
    <cfset isAuthenticated = false /> 
</cfcatch> 
</cftry> 

<cfreturn isAuthenticated /> 

我把它包裝在一個名爲「authenticate」的函數中,並通過我從我的應用程序調用的Web服務公開它。如果我然後需要有關用戶的其他詳細信息(郵件,給定名稱等),我會在同一個Web服務中使用另一個函數,在確定用戶已通過身份驗證後,我會調用它。請注意,在這個其他功能中,我使用我的管理員用戶名和密碼來運行查詢。

<cfldap action="Query" 
    name="ADResult" 
    attributes="mail,givenName" 
    start="DC=domain,DC=net" 
    filter="sAMAccountName=#arguments.username#" 
    server="servername" 
    scope = "subtree" 
    username="administrator" 
    password="myAdminPassword" /> 

我拿這個結果,填充查詢對象或結構,並將其返回給調用函數。

所以整個過程看起來有點像這樣:

<cfset objAD = createobject("webservice", "http://mywebservice.com") /> 
<cfset isAuthenticated = objAD.authenticate(form.username, form.password) /> 
<cfif isAuthenticated> 
    <cfset userDetails = objAD.getUserDetails(form.username)> 
</cfif> 

希望這有助於。