2016-08-17 101 views
2

我目前正在尋找某種最佳做法,即在用戶登錄到某個用戶時更改用戶的活動目錄用戶密碼基於asp.net的Web應用程序和密碼已過期,並在登錄會話。MS修補程序後在c#/ asp.net中更改Active Directory用戶密碼KB3167679

我們正在運行的Windows Server 2008 R2,IIS7應用程序了與.NET Framework 3.5的

到目前爲止,我用這個:

public int changeUserPassword(String _userID, String _oldPassword, String _newPassword, bool _change) 
{ 
    try 
    { 
     PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, "do.ma.in", "DC=do,DC=ma,DC=in", 
     ContextOptions.SimpleBind, @"domain\admin_account", "admin_pw"); 
     UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, _userID); 

     if (_change) 
     { 
      oUserPrincipal.ChangePassword(_oldPassword, _newPassword); 
     } 
     else 
     { 
      oUserPrincipal.SetPassword(_newPassword); 
     } 
     oUserPrincipal.Save(); 
    } 
    catch (Exception e) 
    { 
     //error handling 
    } 
    return 1; 
} 

此方法處理髮起PW變化後用戶的情況下,登錄,在過期的pw登錄(ChangePassword方法)期間更改以及密碼重置,其中生成臨時密碼等(SetPassword方法)。

我們需要ChangePassword方法的原因是有一個關於當前密碼的用戶確認,所以AD密碼歷史被應用,因爲我們不允許最後的x個密碼。 SetPassword只是設置密碼,不管它是否在最近的歷史記錄中。

SetPassword似乎仍然可以正常工作,但自Microsoft修補程序KB3167679以來,更改密碼方法似乎不再有效。 KB3167679 該文章特別提到,這隻會發生在被鎖定或禁用的帳戶,但當帳戶處於活動狀態或處於「密碼過期」模式時,它也不再起作用。 異常消息I geet是「一個或多個輸入參數無效」。

我以前使用過另一個使用DirectoryEntry的實現,但它有錯誤,因爲它有時可以工作,有時它不會,這很煩人。所以我寧願不回去。

我們在具有新補丁的實例上觀察到這一點,沒有它的實例可以正常工作。我還能夠在測試服務器上重現該行爲,該方法在安裝所述修補程序後停止工作。

不幸的是,微軟並沒有提供這篇文章中的最佳實踐,我似乎也無法找到自己的一個。所以問題是如果你對我有一個提示什麼是標準的方式去這裏。

回答

2

我遇到過類似的問題。嘗試將ContextOptions.SimpleBind更改爲ContextOptions.Negotiate

+0

非常感謝,這確實有用。到目前爲止,我所有的測試都很成功如果它在特定情況下失敗,我會報告。 – vm370

相關問題