是System.Security.Principal.WindowsIdentity
合理從安全的被黑客攻擊這樣的情況下,我從Thread.CurrentPrincipal
的Identity
或WindowsIdentity.GetCurrent()
已true
爲IsAuthenticated
給我的裝配虛假的身份信息得到什麼?當然,沒有什麼是完全防篡改的,但考慮到微軟對.Net的承諾和依賴,我期望這樣的關鍵API可以被鎖定爲難以破解,難以篡改。這是我的一個有效的假設?System.Security.Principal.WindowsIdentity的這種用法是否合理安全?
我的目標是在我的程序集中提供合理的最佳實踐SSO。如果Windows本身受到了威脅,那就超出了我的控制範圍,但是如果(例如)與我的程序集鏈接的應用程序直接提供給我錯誤信息是一件簡單的事情,那麼我就沒有做盡職調查。這是我無知的一大方面。
要清楚,我在尋找硬性信息,而不是關閉袖口的意見。因此,發佈了漏洞利用,或以一種欺騙我的代碼的方式展示了對構造函數的使用,等等。或者在「這是一個有效的假設」的一面,支持它的實體文章,依賴它的已知使用等等。找到他們很幸運,但我已經包括了我在下面的分隔符下發現的內容。
這是我打算如何使用WindowsIdentity
:
using System.Security.Principal;
using System.Threading;
// ...
// I only want Windows-authenticated users
WindowsIdentity identity = Thread.CurrentPrincipal == null
? null
: Thread.CurrentPrincipal.Identity as WindowsIdentity;
SecurityIdentifier sid;
// I can't imagine how an authenticated account would be anonymous, but...
if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) {
// SSO success from thread identity
sid = identity.User;
// ...check that that SID is allowed to use our system...
} else {
identity = WindowsIdentity.GetCurrent();
if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) {
// SSO success from current Windows user
sid = identity.User;
// ...check that that SID is allowed to use our system...
} else {
// SSO fail
}
}
這是一個DLL組件 —可悲的是我們堅持.Net的3.5 —,提供了一個公共的API可以通過限制資源用戶權利。它可能用於桌面應用程序或使用Windows身份驗證的ASP.Net IIS應用程序(使用Windows身份驗證時,ASP.Net在Thread.CurrentPrincipal.Identity
上設置WindowsIdentity
實例;目前我們不支持其他類型的IIS身份驗證)。
我可以合理地信任來自WindowsIdentity
實例的SID嗎?聲稱這樣認證的來源?
它沒有想到我不知道這是否是好的(DOH!),直到this question用戶lc.提出了一個問題,大會將容易受到與它和鏈接的惡意應用程序被欺騙「僞造「那些信息。儘管如此,他沒有任何具體的證據指出爲什麼這可能是一個重大問題。
什麼(小),我發現迄今:
This answer使得要求
您可以相信,當前
WindowsIdentity
是它說誰是,只要因爲您可以信任應用程序中的任何給定數據。本書Hacking the Code聲稱,ASP.Net需要
WindowsIdentity
做文件authorizaton檢查,如果是真的,似乎這是一個相當堅實的基礎,說微軟,至少,認爲不夠好時要與請求相關聯。我可以找到很多人在他們的代碼中愉快地使用
WindowsIdentity
信息的例子,但是他們中的大多數人並沒有問他們是否安全。這裏有一個蘊含,但是......
在什麼情況下你問這個?你在談論ASP.NET和桌面應用程序。這可能是顯而易見的,但是[當在一個「pwned」系統上運行時,所有投注都關閉 - 惡意用戶可以以任何他們想要的方式在進程中注入和修改)(http://stackoverflow.com/questions/8357469/如何-可以-我保護,我 - 私人 - funcs中,對反射執行的)。 – CodeCaster
@CodeCaster:如果Windows本身已經妥善妥協,那就超出了我的控制範圍。但是,如果(例如)一個應用程序可以創建一個'WindowsIdentity'實例,將其分配給當前線程,然後調用我的程序集並誘使我相信它們是他們不是的人,那會對我造成失敗勤勉。基本上,我試圖達到合理的最佳實踐SSO。我沒有質疑我是否可以信任上面的API,直到用戶在我的另一個問題上標記它(他可能只是偏執狂),然後我擔心我不知道的東西,在這個領域是哪一個許多。 :-) –