2009-09-24 33 views
0

以下是我們當前的設置。我們配置了Active Directory(域名爲mis1),用於處理我們所有的身份驗證問題。我們爲impersonation = true設置了Web應用程序設置,以便我們可以在用戶登錄時調用我們的數據庫查詢。對於此特定應用程序,IIS設置爲匿名訪問,我們可以使用表單身份驗證。如何使用WindowsIdentity和SQL Server集成安全性設置表單身份驗證

對於我們的數據庫的安全,我們必須在數據庫服務器上本地組的設置,並將用戶添加到需要每個應用這些羣體。例如,我們將爲同一個FancyPants應用程序創建一個「FancyPantsManager」組和一個「FancyPantsUser」組。然後我們設置SQL Server 2005登錄來映射到服務器上的這些本地組。

我想要做的是爲AD認證的用戶提供一個登錄頁面,然後如果成功,請去數據庫服務器獲取他們的角色(通​​過調用xp_logininfo)存儲在用戶的會話中。

到目前爲止,我有窗體身份驗證通過做的P/Invoke從avapi32.dll文件中的LogonUser方法成功驗證過的Active Directory。然後我得到結果令牌並生成一個WindowsIdentity對象並冒充用戶。代碼如下所示:

Private Sub loginMain_Authenticate _ 
       (ByVal sender As Object, _ 
       ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) _ 
     Handles loginMain2.Authenticate 

    ' Assume variables properly declared 

    IsAuthenticated = LogonUser(UserName, LOGON_DOMAIN, UserPass, 
           LOGON_TYPE, LOGON_PROVIDER, ResultToken) 

    If IsAuthenticated 

     ' Setup impersonation for validated user. 
     WindowsId = New WindowsIdentity(ResultToken) 
     IdentContext = WindowsId.Impersonate() 

     ' Call stored procedure to retrieve roles using validated user for login. 
     GetUserRoles(UserName) 

    End If 

End Sub 

當我通過調試器並輸入我的正確ID和密碼。我通過身份驗證,並查看生成的WindowsIdentity對象,它指出我的Id是「mis1 \ c07884」,這正是模擬到達SQL Server所需的內容。然而,當方法getRoles被調用時,我得到了以下錯誤消息:

System.Data.SqlClient.SqlException: Could not obtain information 
about Windows NT group/user 'c07884', error code 0xffff0002. 

在我看來,有些事情是不能與模擬過程中進行適當的發生。我錯過了什麼?

回答

0

注意這個問題可能有幫助嗎? Active Directory: Retrieving User Information

+0

Nah!...我想這不是你想要的,是嗎? – 2009-09-24 19:32:24

+0

關閉,但我需要一個授權令牌,以便我可以連接到數據庫,並保存用戶網絡會話的部分票據。 – 2009-09-24 19:34:35

0

編輯刪除irelevant內容。

xp_logininfo。看起來像你調用它傳遞的帳戶名稱作爲用戶名無w/o域。這實際解釋了爲什麼錯誤消息顯示爲c07884 not found而不是mis1\c07884 not found。錯誤0xFFFF002可能是錯誤2 ERROR_FILE_NOT_FOUND

現在最快的修復可能是通過正確的帳戶名稱:

GetUserRoles(string.Format("{0}\\{1}"), LOGON_DOMAIN, UserName)); 

你應該考慮重寫程序檢索通過調用x_logininfo不帶參數,返回的信息模擬的用戶信息當前用戶。更好的是,只需SELECT * FROMsys.login_token

如果你東東囂ASP是組成員,你已經擁有它的WindowsIdentity.Groups

+0

我與WindowsIdentity.Groups碰到的問題是,這些組對於數據庫服務器來說是本地的,而不是整個域名。組織能夠將會員資格從個人服務器中撤出,而不是域範圍內? – 2009-09-24 22:25:30

+0

當我調用GetUserRoles時,連接字符串被配置爲使用SSPI,我假設它意味着它將採用登錄的WindowsIdentity的模擬憑據,出於某種原因返回只有c07884沒有域,有沒有辦法更新與登錄關聯的「名稱」? – 2009-09-24 22:26:52

+0

是加入'mis1'域的數據庫主機(或者它是否加入了信任'mis1'的域)? – 2009-09-24 22:53:42

相關問題