簡體   English   中英

在C#中斷言權限

[英]Assert Permissions in C#

我正忙着嘗試理解c#中的安全性,我正在努力去了解Assert的工作原理。 我正在使用.net 3.5。

我做了一個示例應用程序試圖解決這個問題。

通話方式:

[FileIOPermission(SecurityAction.Deny, ViewAndModify = @"C:\")]
    static void Main(string[] args)
    {
        WriteTest testWriter = new WriteTest();
        testWriter.Test();
        Console.Read();
    }

在一個單獨的類庫中,我有:

public class WriteTest
{
    public void Test()
    {
        try
        {
            FileIOPermission permission = new FileIOPermission(FileIOPermissionAccess.Write, @"C:\");
            permission.Assert();
            using (StreamWriter sw = new StreamWriter(@"C:\test.txt"))
            {
                sw.WriteLine("testing!");
                sw.Flush();
            }
            Console.WriteLine("Writen to file!");
        }
        catch (SecurityException sec)
        {
            Console.WriteLine("No privileges!");
        }
    }
}

這段代碼執行得很好。 它將寫入文件。 我的問題是這究竟是如何工作的? 如果我只是斷言我想要的權限以便它跳過檢查,這不會使安全類失效嗎? 如果我將Assert更改為Demand它會引發異常。

安全類的重點是不允許我設置權限,這樣當我調用第三方類時,我可以防止它變成流氓並做一些我不希望它做的事情? 我知道如果我在AppDomain中加載dll,即使第三方DLL確實使用Assert,我也會得到這種效果,如果我直接調用它就會起作用,這似乎很奇怪。 我試過在Assert上閱讀MSDN文檔,但我發現很難理解。

較少特權代碼(“程序集A”)調用更多特權代碼(“程序集B”)來執行某些任務時, Assert()非常有用。 要執行該任務,程序集B需要運行需要強大權限的代碼 - 程序集A可能沒有的權限。 因此,程序集B首先需要一個不太強大的權限(首先執行任務的權限)然后斷言實際執行任務的更強大的權限。

例如,假設部分信任的Silverlight應用程序想要使用System.Net.WebRequest類發出HTTP請求。 建立網絡連接需要SocketPermission ,但這是一個強大的低級別權限,不應授予來自Internet的不受信任的代碼。 因此, WebRequest需要一個不太強大的權限WebPermission ,然后在繼續建立網絡連接之前斷言SocketPermission

現在,在您的特定示例中, Assert()會覆蓋Deny因為類庫在與應用程序相同的權限級別運行 - 應用程序和類庫都可能作為完全信任運行。 程序集始終可以在其授權集中Assert()任何權限。 要在類庫上強制執行Deny ,您必須將類庫放在沙箱中。

注意:在.NET 4.0中, Deny已被棄用。 來自MSDN Library

已刪除運行時支持以強制執行Deny,RequestMinimum,RequestOptional和RequestRefuse權限請求。 通常,這些請求未被充分理解,並且在未正確使用時可能存在安全漏洞:

  • 可以通過Assert操作輕松覆蓋拒絕操作。 如果權限位於程序集的授權集中,則程序集中的代碼能夠執行權限的Assert操作。 Assert阻止了Deny在堆棧中被看到,使其無效。

Assert()方法導致代碼訪問安全性(CAS)停止在特定權限檢查請求上執行堆棧。

Assert是一種可以在代碼訪問權限類和PermissionSet類上調用的方法。 您可以使用Assert來啟用代碼(和下游調用方)來執行代碼有權執行的操作,但其調用方可能沒有權限執行操作。 安全性斷言會更改運行時在安全檢查期間執行的正常過程。 當您聲明權限時,它會告訴安全系統不要檢查代碼的調用者以獲取聲明的權限。

使用斷言方法

我想你想要Demand()

出於興趣:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM