【讀書筆記】C#進階編程 第二十二章 安全性

來源:互聯網
上載者:User

標籤:位置   需要   txt   catch   許可權   text   關聯   資訊   line   

(一)身分識別驗證和授權

安全性的兩個基本支柱是身分識別驗證和授權。身分識別驗證是標識使用者的過程,授權在驗證了所標識使用者是否可以訪問特性資源之後進行的。

 

1、標識和Principal

使用標識可以驗證運行應用程式的使用者。Principal是一個包含使用者的標識和使用者所屬角色的對象。

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); var principal = WindowsPrincipal.Current as WindowsPrincipal;var identity = principal.Identity as WindowsIdentity;Console.WriteLine("身份類型:{0}",identity.ToString());Console.WriteLine("名稱:{0}",identity.Name);Console.WriteLine("角色是否為使用者:{0}",principal.IsInRole(WindowsBuiltInRole.User));Console.WriteLine("角色是否為超級管理員:{0}", principal.IsInRole(WindowsBuiltInRole.Administrator));Console.WriteLine("是否身分識別驗證:{0}",identity.IsAuthenticated);Console.WriteLine("身分識別驗證類型:{0}", identity.AuthenticationType);Console.WriteLine("是否匿名:{0}", identity.IsAnonymous);Console.WriteLine("賬戶標記:{0}", identity.Token);

 

2、角色

角色型安全性可以很好地解決資源訪問問題。

 

3、聲明角色型安全性

如果使用非本地User組中的賬戶運行以下代碼,ShowMessage()方法將會拋出一個異常。

static void Main(string[] args){    AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);     try    {        ShowMessage();    }    catch (SecurityException exception)    {        Console.WriteLine("捕捉安全異常:({0})",exception.Message);        Console.WriteLine("當前主體應放置入本機使用者組");    }    Console.ReadKey();}[PrincipalPermission(SecurityAction.Demand,Role ="BUILTIN\\Users")]private static void ShowMessage(){    Console.WriteLine("當前主體已登入本地");    Console.WriteLine("(本機使用者組中成員是)");}

 

4、聲稱

除了使用角色之外,還可以使用聲稱訪問使用者資訊。聲稱與實體有關,描述實體的能力。實體通常是使用者,也可以是應用程式。能力描述了實體允許執行的操作。這樣聲稱比角色模型靈活得多。

var principal = WindowsPrincipal.Current as ClaimsPrincipal; Console.WriteLine();Console.WriteLine("擷取包含所有聲明的集合,這些聲明都來自於此聲明主體關聯的宣告身份識別符。");foreach (var claim in principal.Claims){    Console.WriteLine("主題:{0}", claim.Subject)    Console.WriteLine("頒發者:{0}", claim.Issuer);    Console.WriteLine("聲稱類型:{0}", claim.Type);    Console.WriteLine("實值型別:{0}", claim.ValueType);    Console.WriteLine("值:{0}", claim.Value);    foreach (var prop in claim.Properties)    {        Console.WriteLine("\t屬性:{0} {1}", prop.Key, prop.Value);    }    Console.WriteLine();}

 

5、用戶端應用程式服務

代碼過長不貼文章裡

服務端源碼:Download

用戶端源碼:Download

在運行之前需要注意的是:用戶端的app.config要修改 serviceUri的串連位置為服務端啟動並執行串連,例子:原始碼中的serviceUri為serviceUri="http://localhost:59514/Role_JSON_Appservice.axd",要修改為你運行網站以後的連結地址(假設為http://localhost:9999/)加Role_JSON_Appservice.axd,最終serviceUri="http://localhost:9999/Role_JSON_Appservice.axd"。

 

(二)加密

1、簽名

 1 internal static CngKey aliceKeySignature; 2 internal static byte[] alicePubKeyBlob; 3 static void Main(string[] args) 4 { 5     CreateKeys(); 6   7     byte[] aliceData = Encoding.UTF8.GetBytes("Alice"); 8     byte[] aliceSignature = CreateSignatrue(aliceData,aliceKeySignature); 9  10     Console.WriteLine("Alice建立了簽名:{0}",Convert.ToBase64String(aliceSignature));11  12     if (VerifySignature(aliceData,aliceSignature,alicePubKeyBlob))13     {14         Console.WriteLine("Alice的簽名驗證成功");15     }16  17     Console.ReadKey();18 }19  20 private static bool VerifySignature(byte[] data, byte[] signature, byte[] pubKey)21 {22     bool retValue = false;23     using (CngKey key = CngKey.Import(pubKey, CngKeyBlobFormat.GenericPublicBlob))24     using (var signingAlg =new ECDsaCng(key))25     {26         retValue = signingAlg.VerifyData(data, signature);27         signingAlg.Clear();28     }29     return retValue;30 }31  32 private static byte[] CreateSignatrue(byte[] data, CngKey key)33 {34     byte[] signature;35     using (var signingAlg=new ECDsaCng(key))36     {37         signature = signingAlg.SignData(data);38         signingAlg.Clear();39     }40     return signature;41 }42 43  44 private static void CreateKeys()45 {46     aliceKeySignature = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);47     alicePubKeyBlob = aliceKeySignature.Export(CngKeyBlobFormat.GenericPublicBlob);48 }

 

 

2、交換秘鑰和安全傳輸

使用DiffieHellman演算法交換一個對稱秘鑰,以進行安全的傳輸。

 

(三)資源的存取控制

在作業系統中,資源都使用存取控制清單(ACL)來保護。資源有一個關聯的安全性描述元。安全性描述元包含了資源擁有者的資訊,並引用了兩個存取控制清單:自由存取控制清單(DACL,確定誰擁有訪問權)和系統存取控制清單(SACL,確定安全事件記錄的審核規則)。ACL包含一個存取控制項目(ACE,包含類型、安全性識別碼和許可權)列表。在DACL中,ACE的類型可以是允許訪問或拒絕訪問。可以用檔案設定和獲得的許可權是建立、讀取、寫入、刪除、修改、改變許可和獲得許可。

擷取一個檔案的存取控制清單:

static void Main(string[] args){    string fileName = @"C:\Users\Administrator\Desktop\1.txt";    using (FileStream fs=File.Open(fileName,FileMode.Open))    {        FileSecurity securityDescriptor = fs.GetAccessControl();        AuthorizationRuleCollection rules = securityDescriptor.GetAccessRules(true, true, typeof(NTAccount));         foreach (AuthorizationRule rule in rules)        {            var fileRule = rule as FileSystemAccessRule;            Console.WriteLine("訪問類型:{0}",fileRule.AccessControlType);            Console.WriteLine("許可權:{0}",fileRule.FileSystemRights);            Console.WriteLine("身份:{0}",fileRule.IdentityReference.Value);            Console.WriteLine();        }    }}

 

修改存取權限參考:http://www.cnblogs.com/wolf-sun/p/4591734.html

 

 

(五)程式碼存取安全性

在角色型安全性中,可以定義使用者允許做什麼。在基於代碼的安全性中,可以規定代碼能做什麼。

1、第2級安全透明性

使用SecurityRules特性註解程式集,並設定SecurityRuleSet.Level2,以應用.NET4新增的層級。

[assembly: SecurityRules(SecurityRuleSet.Level2)]

 

2、許可權

如果代碼運行在沙箱中,沙箱就可以定義.NET許可權,以定義代碼允許執行的操作。許可權是允許(或禁止)每個程式碼群組執行的動作(例:讀取檔案系統中的檔案)。.NET許可權獨立於作業系統許可權。.NET許可權僅由CLR驗證。

 

(1)許可權集

許可權集是許可權的集合。

 

(2)通過編程要求許可權

程式集可以用聲明或編程的方式要求許可權。

 

(3)使用沙箱API包含未授權的代碼

 

 

(五)使用認證發布代碼

可以利用數位憑證來對程式集進行簽名,讓軟體的消費者驗證軟體發行者的身份。

【讀書筆記】C#進階編程 第二十二章 安全性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.