使用者模擬(
impersonation
)是自從
windows 2000
時引入的強大的功能。
windows
系統甚至允許使用者模擬(
impersonation
)被用在客戶端
/服務端的程式設計模型裡面。
在傳統模式下,比如乙個遠端伺服器可以提供檔案、印表機或者資料庫服務,希望使用這些資源的客戶端可以傳送乙個請求給遠端伺服器,這時候,遠端伺服器必須要確保客戶端有許可權來訪問它請求的資源,於是遠端伺服器查詢使用者的帳號和組資訊,然後查詢資源的安全描述符來判斷資源訪問是否被允許。這個過程需要大量的編碼,並且非常容易出錯,而且也不能自動整合後續版本作業系統帶來的新的安全特性。因此
windows 2000
起,我們可以使用使用者模擬(
impersonation
)來簡化這個問題—比如
iis裡面就使用到了使用者模擬(
impersonation
)功能。
比如,我們在區域網裡面新建了乙個**,區域網使用者可以使用這個**上傳自己的,編輯自己的檔案,並且可以跟自己的好友共享這些和檔案。**使用
windows
驗證方式,這樣就省去了區域網使用者登入**的麻煩。就是說如果使用者開啟
ie訪問**的時候,直接就獲得了相應的訪問許可權
—這也是
sharepoint server
使用的使用者身份驗證方式。另外在設計的時候,為了得到更大的可擴充套件性,和檔案不是儲存在資料庫裡面的,而是直接儲存在檔案系統(也許是分布式檔案系統)裡面的。也即是說,當新建了乙個使用者
a的時候,
1.**就在域裡面新建乙個使用者
a,還建立了乙個使用者組
a』s friend—
用來儲存使用者
a的好友帳號;
2.並且在儲存和檔案的分布式檔案系統裡面建立了乙個資料夾
a,這個資料夾
a有讀寫許可權,而
a』s friend
只有讀的許可權,其他使用者預設沒有任何許可權。當a
在瀏覽器裡面上傳,**接受並且把儲存到資料夾
a裡面。這樣就為**的實現提出了乙個難題,即**
asp.net
程式以什麼使用者身份執行?
n如果以域管理員帳號執行的話,那麼無疑帶來了很大的安全方面的風險,因為域管理員帳號在域裡面的控制權可以說是無限大的,如果你的****沒有考慮到一些網路攻擊
—很容易就造成整個域癱瘓掉。
n而如果以其他的帳號執行,又怎麼保證**有許可權將使用者
a上傳的儲存到資料夾
a裡面去?
這種情形,你就可以使用使用者模擬(
impersonation
)功能,**只要執行在最低許可權—例如
network service
使用者下面,當需要儲存使用者
a上傳的時,**所要做的就是獲取使用者
a的登入資訊暫時模擬使用者
a,將儲存到資料夾
a中後,回滾使用者模擬(
impersonation
)操作,重新讓**執行在最低許可權下。這樣既做到系統的可擴充套件性,又做到了將安全風險降到最低的目標。這種許可權驗證方式省卻了重複實現安全子系統的努力,而將使用者許可權管理整合到
windows
域管理系統裡面,另外系統的可擴充套件性也解決了,因為據測試,
windows
的active directory
可以支援上億使用者
—好像沒有幾個區域網能有這麼多的使用者吧?
impersonation
)來模擬乙個使用者。執行緒的訪問令牌(
access token
)包含了模擬資訊(
impersonation token
),並且還包含了執行緒的真實安全憑據(
security credential
),因此在模擬完乙個使用者以後,執行緒還能重新使用自己實際的訪問令牌(
access token)。
為了避免遠端伺服器濫用使用者模擬(
impersonation
)功能,
windows
系統允許客戶端對使用者模擬(
impersonation
)進行一系列的限制:
限制型別
說明
security_anonymous
最嚴格的限制
—遠端伺服器不能模擬客戶端的使用者身份
security_identification
允許遠端伺服器獲取客戶端使用者的安全身份識別符號(
sid)和使用者的許可權資訊,但是伺服器不能模擬使用者身份。
security_impersonationn
允許遠端伺服器在訪問本機資源的時候模擬使用者身份
security_delegation
允許遠端伺服器在訪問本機和遠端機資源的時候模擬使用者身份
如果客戶端不進行限制,那麼預設遠端伺服器具有
security_impersonationn
許可權,即可以在訪問本機資源的時候模擬使用者身份。
使用者模擬的**:
[dllimport("advapi32.dll", setlasterror = true)]
private
static
extern
bool logonuser(string lpszusername, string lpszdomain, string lpszpassword, int dwlogontype, int dwlogonprovider, ref intptr phtoken);
intptr tokenhandle = intptr.zero;
bool
returnvalue = logonuser(username, domainname, password.tostring(),
logon32_logon_interactive, logon32_provider_default,
ref tokenhandle);
console.writeline("before impersonation: "
+ windowsidentity.getcurrent().name);
windowsidentity identity = new windowsidentity(tokenhandle);
windowsimpersonationcontext impersonateduser = identity.impersonate();
console.writeline("after impersonation: "
+ windowsidentity.getcurrent().name);
impersonateduser.undo();
console.writeline("after undo: " + windowsidentity.getcurrent().name);
if(tokenhandle != intptr.zero)
closehandle(tokenhandle);
Windows使用者管理
使用者賬戶 使用者賬戶擁有唯一的安全識別符號 每個使用者包含乙個名稱和乙個密碼 不同的使用者身份具有不同的許可權 sid 安全識別符號 檢視使用者安全識別符號 普通使用者 從1000開始,管理員是固定的 500 administrator 例 s 1 5 21 1178262980 10218937...
Windows使用者管理
1 使用者賬戶 不同的使用者身份擁有不同的許可權 每個使用者包含乙個名稱和乙個密碼 使用者賬戶擁有唯一的安全識別符號。2 使用者劃分原則 系統許可權和資料庫分離,超級使用者許可權和普通使用者許可權分離。3 使用者管理的意義 在伺服器上,需要謹慎分配超級使用者許可權,盡量使用普通使用者,進行日常伺服器...
windows使用者管理
使用者擁有不同的操作許可權,每乙個使用者擁有唯一的sid。uid 500固定給administrator使用。普通使用者的uid從1000開始。賬戶與密碼的儲存位置 c windows system32 config sam 使用hash演算法記錄。暴力破解 社會工程學密碼破解工具 伺服器預設密碼最...