2012-07-17 136 views
2

我有一個程序,其中用戶基地在Active Directory中。它使用ADFS作爲AD和我的程序之間的中介。我使用C#安全令牌從ADFS得到有效令牌一旦一個人試圖登錄C#安全令牌錯誤3242

如果登錄嘗試某種原因失敗時,我收到一個錯誤3242

{「ID3242:安全令牌無法進行身份驗證或授權。「}

當我輸入錯誤的用戶名或密碼錯誤或密碼在Active Directory中過期時,會發生這種情況。

如果用戶登錄失敗,我希望能夠給他們一個更好的錯誤信息,說明他們爲什麼無法登錄。這將是理想的告訴他們,他們的密碼已過期(如果是),並可能提供有關如何重置它的指示等。

所以我對你的問題都是這樣的:當使用C#SecurityToken對象,如何在登錄失敗時向用戶提供更好的錯誤消息?

我對這些概念很陌生,所以我提前道歉了一些細小的細節。這篇文章是我把我的觸角伸出去,看看有沒有人能指出我的好方向。提前感謝您的時間和回覆。

回答

1

您的問題是關於「過期的密碼」,而您的評論是指「過期的帳戶」。他們是非常不同的野獸!

過期密碼 - ms-DS-User-Account-Control-Computed attribute

到期帳戶:

principalContext = GetPrincipalContext(ldapOU); 
userPrincipal = new UserPrincipal(principalContext); 
DateTime date = userPrincipal.AccountExpirationDate; 

會給你的日期,然後簡單地比較。

+0

你是對的,這只是我迄今對這個領域陌生的一個例子:)謝謝你的迴應!然而,我的意思是過期的密碼。我要研究你的建議! – 2012-07-18 13:47:56

+0

ms-DS-User-Account-Control-Computed屬性 - 這是從C#訪問的東西嗎?我發現有返回值,比如UF_PASSWORD_EXPIRED,但是這個結果會出現在哪裏? – 2012-07-18 14:30:14

+0

確實如此。頁面向下到文章的底部,並有一個代碼片段。片段顯示UF_LOCKOUT,但您只需要替換UF_PASSWORD_EXPIRED。 – nzpcmad 2012-07-18 19:35:35

1

你不能讓錯誤消息行爲本身是任何不同的。但是,如果用戶存在,帳戶被禁用,並且帳戶過期,則可以捕獲異常並查詢AD以剝離用戶,然後將原始異常包裝在新的異常中,以提供額外的詳細信息並拋出該異常。但是,提供有關是否是用戶名或密碼不好的信息通常也不是一個好主意,因爲攻擊者可以使用它來獲取有關係統的有用信息。正是出於這個原因,錯誤信息首先不會返回這些信息。當用戶報告問題時,管理員可以隨時檢查帳戶。

+0

非常感謝您的回覆!你有好點子,好點子!比方說,我只是想看看一個帳戶是否過期,你知道任何C#庫,這將使我能夠查詢這樣的事情嗎? – 2012-07-17 19:26:23

+0

System.DirectoryServices命名空間似乎是人們從這類任務開始的地方。 – 2012-07-17 19:44:48

+0

請參閱http://stackoverflow.com/questions/1394025/active-directory-ldap-check-account-locked-out-password-expired。 – JamieSee 2012-07-17 20:27:43