久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

ASP.NET安全架構--如何實現(xiàn).NET安全

 昵稱10504424 2013-07-12
 ASP.NET安全架構--如何實現(xiàn).NET安全 

       前言:大家是否在用Forms驗證的時候,,常常被很多的概念攪混,?是否真的明白什么是Principal,Identity,以及IPrincipan...?很多的文獻很少提及這些到底是什么,,僅僅是怎么用,,結果出問題,導致很多的朋友的理解僅僅停在表面,,使用起來也是束手束腳,。相信看完本篇,會有一定的收獲的,。

 

       ASP.NET安全架構為實現(xiàn)Web應用程序的安全模式提供了對象模型,。不管我們選擇哪一種的身份驗證模式,其中很多的要素是相同的,。登錄到應用程序的用戶按照他們提供的憑證被授予Principal和Identity,。其中Principal對象表示的是用戶的當前的安全上下文,包括用戶的標識和他們所屬的角色,。Identity對象表示的是當前用戶,。Principal對象是利用Identity對象(表示用戶的標識)創(chuàng)建的,,而且它添加一些額外的信息,比如角色或者自定義的數(shù)據(jù),。


       簡言之:Principal=Identity+角色+自定義數(shù)據(jù) 

      大家要注意一點:身份驗證是發(fā)生在ASP.NET運行的特定的時期的,,記住這一點,具體的以后會講的,。 下面我們具體的談:

       一 表示安全的上下文
       Identity對象表示的是通過身份驗證的用戶,。Identity對象的類型取決于所使用的身份驗證,如,,Windows身份驗證使用的是 WindowsIdentity對象,,而Froms驗證使用的是FormsIdentity對象。


       大家開始接觸Identity概念有點難受,,其實說白了Identity就是一個用戶的標識,標識是什么,?就是標明用戶是什么,用戶名字是什么而已,,只是我們這里說的比較專業(yè)一點點而已,。
 
       另外,Principal對象表示的是通過身份驗證的用戶的組或者角色的成員:也就當前用戶安全上下文,。說安全上下文,,說白點就是這個對象包含很多的用戶身份的一些信息。Principal對象是有IIS中的Windows 身份驗證自動的創(chuàng)建的,,但是我們也可以創(chuàng)建普通的Principal對象(大家后面就慢慢明白的).
       大家在編程的時候,,或多或少用過HttpContent.Currrent.User屬性,其實它表示的就是一個Principal對象.Principal對象是實現(xiàn)了IPrincipal接口的,。
 
 
       IPrincipal 接口
       不同的身份驗證模式對安全的上下文有不同的要求,。我們可以利用Principal對象表示當前的安全上下文。IPrincipal接口定義了Principal對象的基本功能,。而且我們還可以自定義安全的上下文對象,,只要實現(xiàn)System.Security.Principal接口:

      
       Identity屬性--可以獲取當前Principal對象的Identity.之前說過:Principal包含Identity就是這個原因。
       IsInRole(string roleName)方法--可以判斷當前的Principal對象是否屬于指定的角色,。大家在變成時候也用過類似的HttpContent.Current.User.Identity.IsInRole("Admin")語句,。
 
       Principal對象可以通過HttpContent.Current.User屬性訪問到,下面的代碼大家應該都用過的:

      

 if(HttpContext.Current.User.Identity.IsAuthenticated)
 
{
  lblUserName.Text
=HttpContext.Current.User.Identity.Name+"已經(jīng)登錄";
 }



       (注:Identity是用戶的標識,,包含用戶名。我們后面會講的) 

      下面的代碼就更加的常見了:判斷當前的用戶是否是管理員角色
      

 if(HttpContext.Current.User.IsInRole("Admin")
 {
  
//
 }

 

       接著我們就看看ASP.NET內(nèi)置的實現(xiàn)了IPrincipal接口的對象:
 
 GenericPrincipal類
 
       GenericPrincipal類實現(xiàn)了IPrincipal接口,。從名字可以看出GenericPrincipal對象表示的是一個一般的,,基礎的安全上下文,它僅僅只是定義了當前用戶的角色,,也就是說這個對象只是部分的實現(xiàn)了IPrincipal接口,。(以后我們就把實現(xiàn)IPrincipal接口的對象稱為 主體),。對于一種身份驗證模式來講,如 Windows身份驗證,,它使用的就是WindowsPrincipal,,因為WindowsPrincipal更加具體的實現(xiàn)了IPrincipal。而在Forms驗證中,,用的只是一般的GenericPrincipal,。也就是說,我們可以按照我們的要求實現(xiàn)自定義的Principal對象,。下面會講到的,。
 
       IPrincipal接口的每一個實現(xiàn)都要重寫Identity屬性和IsInRole方法。GenericPrincipal類的IsInRole方法是通過把角色值和在字符串在中定義的角色進行比較,,而WindowsPrincipal類的IsInRole方法則是把角色和被分配到Windows用戶帳戶角色進行比較,。

       我們可以創(chuàng)建一個在當前請求的整個生命周期中都要使用的GenericPrincipal類的實例,并把它賦值給HttpContent.Current.User屬性,。
 GenericPrincipal的構造函數(shù)有兩個參數(shù):用戶的GenericIdentity(用戶標識GenericIdentity實現(xiàn)了IIdentity接口),和一個表示用戶角色的字符串數(shù)組,。所以我們之前說:Principal=Identity+角色就是這原因。
       GenericPrincipal 對象一旦被創(chuàng)建,,就可以賦值到HttpContent.Current.User屬性,,用來表示當前請求用戶的安全的上下文。
 
       下面就是創(chuàng)建的代碼例子:
       

復制代碼

//創(chuàng)建一般的GenericPrincipal
 
//我們說過:標識就是包含用戶名的對象,,如下 包含一個名為"xiaoyang"的標識
 GenericIdentity identity=new GenericIdentity("xiaoyang");
 
 
//創(chuàng)建GenericPrincipal
 
//注roles表示的是一個角色的字符串數(shù)組如role=new string{"Admin","Customer"};
 GenericPrincipal principal=new GenericPrincipal(identity,roles);

 
//附加
 HttpContext.Current.User=principal;

復制代碼

 
       注意:上面的代碼是要寫在特定的地方,,也就是生命周期的特定的時候的,我們后面講述,。
 
       說了Principal,,下面就說說用戶標識到底是什么,之前多次提到的,。
 
        二 用戶標識
  
       Identity對象用于標識當前用戶的標識,。標識只能提供少量的安全上下文信息,如用戶名,。Identity對象可以驗證用戶,。
 
       IIdentity接口
       和IPrincipal接口一樣,表示用戶標識的對象都要實現(xiàn)這個接口,。IIdentity接口定義了Identity對象的基本額的結構,,定義如下:


       AuthenticationType(string類型的)屬性--它可以獲取所使用的身份驗證的類型,如,,如果使用的Forms驗證,,該屬性返回"Forms"字符串,所以我們自定義的標識可以返回"CustomIdentity"字符串。
       IsAuthenticated(bool類型)屬性--標識用戶是否通過身份驗證,。我們可以常常用HttpContext.Current.User.Identity.IsAuthenticated來判斷用戶是否已經(jīng)登錄,。
 Name(string 類型的)屬性--獲取用戶的名字,。相信對HttpContext.Current.User.Identity.Name不陌生。


       下面我們就看看我們自己的實現(xiàn)了IIdentity接口的標識類,。

       

 

復制代碼






using System;
using System.Security.Principal;

public class CustomIdentity : IIdentity
{
       
private  string name;
        
//構造函數(shù)只接收一個string參數(shù),大家可以看看之前我們代碼:GenericIdentity identity=new GenericIdentity("xiaoyang");
        public CustomIdentity(string name)
        {
                
this.name = name;
        }

        
//
        private string authenticateType = "CustomerIdentity";
        
public CustomIdentity(string name,string authenticateType)
        {
                
this.name = name;
                
this.authenticateType = authenticateType;
        }

        
//下面就實現(xiàn)接口
        private bool isAuthenticated = false;
        
public bool IsAuthenticated
        {
                
get { return isAuthenticated; }
        }

        
private string name;
        
public string Name
        {
                
get { return name; }
        }
              
}










復制代碼

       上面的代碼只是示范,,大家可以按照自己的要求擴展。
 
 
       和之前一樣,,我們來看看ASP.NET中內(nèi)置的Identity類:
       FormsIdentity--在Forms驗證中使用
       PasswordIdentity--在Passport驗證中使用
       GenericIdentity--一般的普通的標識
       WindowsIdentity--Windows 身份驗證使用
 
       我們來看看GenericIdentity的使用,,其他的使用類推。
 

       其實GenericIdentity標識的是一個基本的Identity 對象,。它對于Identity對象來說是做基本的,。之前我們看過一個GenericPrincipal的例子,在那個實例中我們創(chuàng)建一個GenericIdentity類的實例,,
   

    GenericIdentity identity=new GenericIdentity("xiaoyang"); 

 
       而且我們還可以提供更加具體的Identity對象,,如之前提到的FormsIdentity,開提供具體的用戶信息,。
 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內(nèi)容,,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多