2008-12-09 95 views
5

任何人都可以解釋SecurityAction枚舉值的含義和用途嗎?瞭解.NET的「SecurityAction」參數的權限

MSDN頁面並不十分清晰。它表示LinkDemand發生在即時編譯中,而Demand則在運行時發生。

爲什麼區別和在什麼情況下我會使用LinkDemand而不是Demand?

同樣,其他有趣的值的用例如InheritenceDemand,Assert和PermitOnly。

回答

18

LinkDemand基本上要求調用代碼具有指定的權限。另一方面,需求不僅要求調用代碼具有指定的權限,還需要調用調用代碼的代碼和調用代碼的代碼等等,一直到堆棧中(或直到斷言被找到;見下文)。

LinkDemand可以在JIT編譯時執行,因爲如果JIT編譯器命中調用帶有LinkDemand的方法的語句,它可以立即確定調用代碼是否具有權限。每次調用該方法時,都需要在運行時強制執行需求,因爲在編譯時不可能知道任何給定調用期間堆棧中的內容。因此,LinkDemand效率更高。但是,這種效率的權衡是不太安全的。使用LinkDemand,您相信調用代碼不會讓ITS調用代碼(可能會或可能沒有權限)將其用於惡意目的。 (換句話說,您相信調用代碼中沒有安全漏洞,調用者可以利用這些漏洞間接使用LinkDemand訪問該方法。)通過Demand,您知道堆棧中的每個人都擁有權限(在直到找到Assert爲止),所以沒有來自不可信來電者的風險。

斷言基本上是需求短路。如果堆棧上的調用者具有活動Assert(換句話說,只有堆棧中的調用者必須具有權限),則需要停止的安全檢查纔會停止。因此,就像LinkDemand一樣,您必須相信具有Assert的代碼不能被其調用者利用。

Deny也是Demand的短路,但不會聲明權限會取消調用者可能擁有的權限。您可以通過確保在可能被利用的調用期間沒有無關的權限生效來幫助防止可能的安全漏洞。

PermitOnly與Deny類似,除了拒絕拒絕特定權限否認每個權限除了指定的權限以外。

InheritanceDemand與其他方法不同,與方法調用沒有直接關係,但表示沒有權限的類無法從具有InheritanceDemand的類繼承。例如,這可以用來阻止不受信任的代碼訪問該類的受保護成員,否則這些成員可能會被後代類訪問。