2013-03-13 78 views
3

鑑於本人使用Windows身份驗證的WCF服務,我想冒充他們,並調用另一個WCF服務,像這樣:驗證當前經過身份驗證的Windows用戶具有委派權限

using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate()) 
{ 
    // call another WCF service 
} 

我給自己定所有的配置設置,它工作正常,只要在客戶端,它們包括以下行:

client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation; 

但是,我怎麼努力使用戶令牌具有委託權限調用之前驗證?即我不控制的客戶端設置了AllowedPersonationLevel?

如果他們沒有設置它,會引發各種奇怪的異常(如無法加載程序集X等)。

理想情況下,我想能夠做到以下幾點:

using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate()) 
{ 
    if (UserDoesntHaveDelegationRights()) 
     throw new SecurityException("No delegation rights"); 

    // call another WCF service 
} 

注意WindowsIdentity.GetCurrent().ImpersonationLevel總是等於TokenImpersonationLevel.Impersonation,讓不幸的是,不是一種選擇。

回答

5

有可能在這裏是定義的一些混亂。在impersonation levels方面Windows標識可以是:

  • 冒充 - 該服務可以冒充本地
  • 委派用戶 - 該服務可以冒充用戶遠程

授權的能力是如此強大它在Active Directory中受到高度限制:

  1. 客戶端必須允許委託
  2. 正在進行授權的服務帳戶必須在Active Directory中標記爲「可信代理」。

以下是如何操作enable an account for delegation。它需要Active Directory域管理員來進行更改。我曾參與過的每個企業環境都有一項不允許委派的政策。

回到你的問題:

因此,儘管TokenImpersonationLevel.Delegation存在,它被認爲是安全風險,很少(如果有的話)使用。 TokenImpersonationLevel.Impersonation是您可能獲得的最高級別。

TokenImpersonationLevel.Impersonation很有用。您仍然可以連接到數據庫或作爲模擬用戶進行遠程服務呼叫。但遠程服務(不在同一個盒子上)不能再次模擬用戶。基本的經驗法則是「模擬啓用兩臺機器跳躍」。如果用戶的憑證必須「跳」得更遠,則會失敗。

如果您需要在多臺服務器之間傳遞用戶憑據,最佳選擇是聯合安全模型,例如Windows Identity Foundation(WIF)。見Identity Management in Active Directory

0

什麼

if (WindowsIdentity.GetCurrent().ImpersonationLevel != TokenImpersonationLevel.Delegation) ... 
+0

是的,這就是我的想法 - 但WindowsIdentity.GetCurrent()。ImpersonationLevel總是等於模擬 – Gareth 2013-03-14 05:12:07

相關問題