簡單地說:我可以生成C++某種文本信息 - 用戶令牌,會話令牌,訪問令牌 - 當前登錄的Windows用戶,然後驗證該文本信息(認證用戶(?) )其他地方(域中的不同計算機)?Windows身份驗證令牌C++
我有兩臺電腦。在第一個用戶應該能夠通過客戶端應用程序連接到我的服務器應用程序運行在第二臺計算機上。他必須使用Windows身份驗證,因此服務器將使用他的Windows組獲取一些信息 - 無需發送用戶名/密碼。我的想法是(不知道是否有可能)是客戶機/進程知道當前用戶,所以它會獲取用戶的訪問令牌或類似的東西,傳遞到服務器(作爲字符串參數),服務器將驗證這個令牌字符串是有效的,並將獲得該用戶和他的組的下一個操作的名稱,這就是我需要的。
這可能只是一個信息,從客戶端發送到服務器(此訪問令牌/會話令牌或如何調用)? (http服務器,我只是想發送一個字符串令牌一次與一個登錄請求,目前用於其他專有方式的身份驗證,沒有握手/談判或類似的東西,如果可能的話)。我正在使用C++。
我目前發現的兩種方式(可能的方式如何不這樣做;))
1)像OpenProcessToken,GetTokenInformation功能 - 這讓我獲得訪問令牌,但它僅僅是處理,我也許可以用它只有在我的過程中,不可能發送到其他地方...
2)像AcquireCredentialsHandle,InitializeSecurityContext,AcceptSecurityContext - 今天的功能我花了很多時間與此 - 我做了一些測試應用程序使用這些功能,只是運行在一個過程中,我目前不確定如何通過兩臺計算機之間的「文本」通信來實現,但這並不重要 - 似乎有更多的回合必須做 - 客戶端創建一些東西(上下文,證書,令牌等),將它發送到服務器,服務器做一些事情,迴應客戶端,客戶端獲得結果等。我可以通過創建「會話令牌「併發送它(例如,如果需要,使用域@用戶名),而沒有其他信息返回並在那裏呢?
任何幫助表示讚賞,謝謝!
編輯:基於下面的第一條評論,似乎我需要澄清這一點: 想象一下,用戶運行Web瀏覽器並連接到我的服務器應用程序的其他地方。他想發送像「CONNECT」和「DO_STUFF」這樣的命令。只有該用戶可以先連接,服務器應用程序纔會do_stuff。但是,這個用戶只能連接,例如,它是一些Windows組的成員(使用Windows身份驗證,而不是某些專有用戶和密碼)。所以服務器必須檢查這個用戶是否是該組的有效成員。但是服務器當然可以根據用戶提供的文本信息來做到這一點。那麼,用戶可以發送他的Windows用戶名和密碼通過服務器應用程序進行身份驗證(應該由C++函數LogonUser或其他)完成,但這是危險的,我不希望用戶在某處輸入他的用戶名和密碼,我只是想要他「點擊登錄按鈕」和C++會在乎休息,因爲它可以檢查他當前會話的數據,他已經登錄。我的想法是隻提供用戶名和某種類型的字符串用戶令牌(會話令牌,訪問令牌,我不知道這將用戶的客戶端應用程序生成精確的術語)(使用Kerberos,NTLM,我不知道)和服務器將收到此字符串信息,它會檢查該令牌驗證,「這是有效的有效的Windows用戶的標記,這裏是他所屬的組「......類似的東西。希望這個解釋有幫助。
我假設你已經考慮過遠程桌面/ RDP並且它不工作? – Widor 2012-02-21 15:31:04
使用遠程桌面是什麼意思?這是C++編寫的應用程序,它將根據客戶端應用程序在不同計算機上提供的信息對用戶進行身份驗證,該用戶已登錄。我需要從客戶端應用程序獲取一些信息以允許登錄到服務器應用程序(例如,如果用戶處於一些特殊的窗口組使其變得簡單)。我不想發送贏取用戶名和贏取密碼,我想發送贏取用戶名和贏取令牌。 – user1173626 2012-02-21 15:46:48
好吧,它是C#,但這聽起來像你可能會嘗試:http://stackoverflow.com/questions/288796/how-to-use-terminal-services-programmatically – Widor 2012-02-21 16:06:10