2009-09-09 100 views
0

我有建(由承包商)一個相當複雜的Web應用程序使用集成身份驗證。作爲認證過程的一部分,使用GetNetworkID()功能,看起來像這樣:ASP.NET認證故障

private string GetNetworkID() 
{ 
    return HttpContext.Current.User.Identity.Name.Split(new char[] { '\\' })[1]; 
} 

當我在我的開發運行此,該HttpContext.Current.User.Identity.Name的MyNetwork \\ myUserID,因此上述功能可按回報我的用戶ID,如預期的那樣,並且認證過程工作得很好。

但是,當我在我的Web服務器上運行,我得到一個指數由return語句在GetNetworkID()函數拋出的陣列誤差的範圍之外。

我有點失去了對如何解決這個問題以及如何找出如果它是一個IIS配置問題(我的Web服務器是Windows Server 2008的機器上運行IIS 7),或別的東西。

如果我硬編碼我的用戶ID作爲GetNetworkID()函數的返回值,它工作在網絡服務器上,但我沒有關於如何在Web服務器上調試,以確定哪些HttpContext.Current.User.Identity.Name任何偉大的想法返回值是導致數組索引錯誤。

有什麼建議嗎?

+0

這是不是可以調試或登錄你的機器上如果,。?例如HttpContex t.Current.User.Identity.Name是一些意想不到的東西,比如ASPNET,那麼它可能是你盒子上的IIS配置問題。 – 2009-09-09 22:59:35

+0

感謝大衛 - 就像我說的,它可以在我的機器上運行(並且我使用VS和Cassini,所以我沒有任何IIS配置可以做)。當然,我在服務器上安裝了IIS,但它具有最通用的開箱即用設置,並且我嘗試在該端調整身份驗證的操作不成功。 – theog 2009-09-09 23:06:53

+0

編輯:我應該提到,我已經嘗試了Response.Write方法來解決許多不同的問題。這有點令人費解,因爲認證代碼中涉及其他一些步驟,但它看起來像是返回我的名字(「Joe Blow」)而不是我的用戶ID。所以,是的,也許我只是在那裏回答我自己的問題......讓我對此做一點工作。 – theog 2009-09-09 23:10:20

回答

2

IIS運行的IIS服務帳戶,所以Current.User.Identity很可能將成爲IIS帳戶的名稱。

爲了完整起見,您應該使用Find()或調用split來檢查'\',並檢查結果數組的長度。如果長度爲1,則表示該ID不是域\用戶名的形式。

一般來說,如果你想調試,你可以寫像這樣的任何值到HTTP響應流:

Response.Write(HttpContext.Current.User.Identity.Name) 

另一種方法是建立一個ASP頁面變量和頁面變量設置爲你想要檢查的價值。您可以通過ASP代碼或通過Javascript顯示變量值。

+0

這很有幫助,謝謝Alan。 – theog 2009-09-09 23:11:06

+0

好吧,所以艾倫贏得了獎項,我因爲缺乏洞察力而自我管理。事實證明,在我的本地機器上,HttpContext.Current.User.Identity.Name是MyNetwork \\ MyUserID。在服務器上,值是「Joe Blow」。不知道爲什麼;不知道我將如何處理這個問題,但這是拋出數組索引錯誤。謝謝大家的時間,而不是叫我出頭,因爲我是。 – theog 2009-09-09 23:49:21

+0

把它修好了,這是一個簡單的設置。事實證明,我只是在查看應用程序目錄的IIS身份驗證方法,嘗試不同的設置,但沒有成功。 「Joe Blow」返回值發生在匿名身份驗證中,導致數組索引異常。所有其他的認證方法給了我一個401響應。事實證明,在服務器級別的Windows身份驗證被禁用,並設置爲給用戶一個401響應。一旦我在服務器級啓用了Windows身份驗證,它就像一個冠軍 - 沒有數組索引異常和成功的身份驗證。 – theog 2009-09-10 17:59:40

1

我想登錄到其他服務器上的Web applciation用戶,不是一個有效的登錄。因此,結果不會在User.Identity.Name上返回。

像你說的,它的工作原理,當你硬編碼的用戶名。 這意味着,您所使用的登錄PC的用戶creditials不允許在網站上。因此,這必須與您硬編碼的憑據不同。

最好的選擇是在Web服務器上進行調試(這並不難 - 你想要返回的就是User.Identity.Name,你可以從中得到用戶名和邏輯推理邏輯),然後驗證你的內容web.config文件。

+0

感謝您的幫助,waqasahmed。 – theog 2009-09-09 23:50:15

2

您可能會缺少IIS設置。

在IIS中嘗試: 網站(右鍵點擊)|屬性|目錄安全(選項卡)

單擊「編輯...「

然後選擇‘集成Windows身份驗證’

+0

並關閉其他形式的身份驗證。 – 2009-09-09 23:33:50

+0

謝謝Destructr ...不確定我是否信任你的用戶名。 :) 儘管如此,我在目錄安全方面做了很多工作,並嘗試了IIS中所有身份驗證設置的組合。沒有運氣。我認爲艾倫讓我朝着正確的方向前進。謝謝。 – theog 2009-09-09 23:40:24

+0

Destructr,啓用WIA的過程在IIS 7中有點不同,但這基本上解決了我的問題。 WIA在我的應用程序目錄上方的父目錄級別被禁用。 – theog 2009-09-10 18:04:18

1

正如艾倫指出,(我upvoted他的話),你可能想什麼形式User.Identity.Name需要添加一個檢查。一個更新的程序例如可以看起來像這樣的:

private string GetNetworkID() 
{ 
    var name = HttpContext.Current.User.Identity.Name; 
    return name.InStr("\\") > -1 ? name.Split("\\")[1] : name; 
} 

這將返回的登錄名的第二部分,如果\存在,以及完整的字符串,如果不

+0

非常好,謝謝托馬斯。 – theog 2009-09-09 23:41:00