.net中的认证和授权(学习笔记)
以前對這部分一直糊涂著,總算理理清楚了
包名:System.Security.Principal:
Identity:(識別)包裝了已經(jīng)驗證過的用戶名和認(rèn)證的方式
?主要成員:Name, IsAuthenticated, AuthenticationType
Principal: 當(dāng)前代碼的security上下文。包含Identity和Roles. 用于授權(quán)
?主要成員:IsInRole, Identity
* // 一般用戶可以有多個Indentity, 即多種身份來訪問不同資源 --pending
* 每個AppDomain里面都有CallContext,CallContext里面包含Principal。線程在啟動的時候也會帶上Pricncipal的ref。靜態(tài)方法,僅對當(dāng)前線程
* Thread.CurrentPrincipal / WindowsIdentity.GetCurrent()靜態(tài)方法返回當(dāng)前用戶。
Permission: 權(quán)限。不是用戶需要權(quán)限,是執(zhí)行它的代碼需要權(quán)限。
???? Demand()要求調(diào)用此代碼的代碼有什么權(quán)限。Assert()斷言
三種權(quán)限:
??1 代碼權(quán)限: 基類為CodeAccessPermission .用來保護環(huán)境變量、文件、訪問非托管代碼。總表參見:
?????? ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/cpguide/html/cpconcodeaccesspermissions.htm
??2 Identity權(quán)限:基類為CodeAccessPermission。對應(yīng)于控制臺中的信任集設(shè)定?;诎l(fā)行者、強類型、域、URL。總表:
???ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/cpguide/html/cpconidentitypermissions.htm
??3. PrincipalPermission(Role Based Permission)
Authorization?授權(quán) 判斷用戶是否有權(quán)操作,比如登錄的用戶有沒有權(quán)限訪問資源或者數(shù)據(jù)庫
Authentication?認(rèn)證 用戶的Identity. 主要有:HTTP基礎(chǔ)認(rèn)證、證書、Kerberos、Passport、NTLM、Forms-based、Digest
這兩個東西最好從讀音上區(qū)別,以前一直糊涂。一般應(yīng)用先authenticate用戶, 判斷用戶是否能鏈接到系統(tǒng)。然后authorization, 判斷對某個功能是否有權(quán)限。
authorization一般有兩種:ACL/ROLES
ACL:Acess Control Lists. 判斷用戶是否在有權(quán)限的用戶組內(nèi)。缺點:不能定義動態(tài)條件。
Role based: 用戶加入到某個role以后,自動獲得了很多特定的權(quán)限。先判斷請求者的Identity, 然后看它是否在Role里面。類似windows用戶和組的關(guān)系
1. 代碼中的檢查方式:new PrincipalPermission(name,role).Demand();
2. 利用Attribute的方式:[PrincipalPermissionAttribute(SecurityAction.Demand,Name="MyUser", Role="Administrator")]
3. 使用 Principal 對象中的屬性和 IsInRole 方法執(zhí)行顯式安全性檢查。
4. web.config里面authorization節(jié)中的users/roles(這個一般資料都沒提到)
參考:
臺灣MSDN Library 中文技術(shù)文件:PPT, 文章
臺灣msdn里面有不少好東西,比china的強多了!
補充:
1. ASP.net中線程的Principal是根據(jù)HttpComtext.Current.User來的,但是從線程取更值得推薦(與asp.net無關(guān))
2. AppDomain.CurrentDomain.SetPrincipalPolicy設(shè)定Thread.CurrentPrincipal的預(yù)設(shè)值
3. AppDomain.CurrentDomain.SetThreadPrincipal(Thread.CurrentPrincipal) 設(shè)定新線程的預(yù)設(shè)Principal, 只能調(diào)用一次
總結(jié)
以上是生活随笔為你收集整理的.net中的认证和授权(学习笔记)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 忏悔书
- 下一篇: 有谁还用QuickReport吗?