標籤:位置 需要 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#進階編程 第二十二章 安全性