ASP.NET安全問題–ASP.NET安全架構--如何?.NET安全

來源:互聯網
上載者:User

                                                            

                                                            ASP.NET安全架構--如何?.NET安全

      

      

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

 

系列文章連結:

ASP.NET開發安全問題

ASP.NET安全問題-- 建立安全的Web應用程式

ASP.NET安全問題--ASP.NET安全架構

ASP.NET安全問題--ASP.NET安全架構--如何?.NET安全

ASP.NET安全問題--ASP.NET生命週期中的驗證以及身分識別驗證模組

ASP.NET安全問題--Forms驗證的具體介紹(上篇)

ASP.NET安全問題--Froms驗證的具體介紹(中篇)

ASP.NET安全問題--Forms驗證(後篇)--實戰篇

ASP.NET安全問題--ASP.NET中的授權問題(前篇)

 

       ASP.NET安全架構為實現Web應用程式的安全模式提供了物件模型。不管我們選擇哪一種的身分識別驗證模式,其中很多的要素是相同的。登入到應用程式的使用者按照他們提供的憑證被授予Principal和Identity。其中Principal對象表示的是使用者的當前的安全上下文,包括使用者的標識和他們所屬的角色。Identity對象表示的是目前使用者。Principal對象是利用Identity對象(表示使用者的標識)建立的,而且它添加一些額外的資訊,比如角色或者自訂的資料。

       簡言之:Principal=Identity+角色+自訂資料 

      大家要注意一點:身分識別驗證是發生在ASP.NET啟動並執行特定的時期的,記住這一點,具體的以後會講的。 下面我們具體的談:

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

       大家開始接觸Identity概念有點難受,其實說白了Identity就是一個使用者的標識,標識是什嗎?就是標明使用者是什麼,使用者名稱字是什麼而已,只是我們這裡說的比較專業一點點而已。
 
       另外,Principal對象表示的是通過身分識別驗證的使用者的組或者角色的成員:也就目前使用者安全上下文。說安全上下文,說白點就是這個對象包含很多的使用者身份的一些資訊。Principal對象是有IIS中的Windows 身分識別驗證自動的建立的,但是我們也可以建立普通的Principal對象(大家後面就慢慢明白的).
       大家在編程的時候,或多或少用過HttpContent.Currrent.User屬性,其實它表示的就是一個Principal對象.Principal對象是實現了IPrincipal介面的。
 
 
       IPrincipal 介面
       不同的身分識別驗證模式對安全的上下文有不同的要求。我們可以利用Principal對象表示當前的安全上下文。IPrincipal介面定義了Principal對象的準系統。而且我們還可以自訂安全的內容物件,只要實現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+"已經登入";
 }

       (註:Identity是使用者的標識,包含使用者名稱。我們後面會講的) 

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

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

 

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

       我們可以建立一個在當前請求的整個生命週期中都要使用的GenericPrincipal類的執行個體,並把它賦值給HttpContent.Current.User屬性。
 GenericPrincipal的建構函式有兩個參數:使用者的GenericIdentity(使用者標識GenericIdentity實現了IIdentity介面),和一個表示使用者角色的字串數組。所以我們之前說:Principal=Identity+角色就是這原因。
       GenericPrincipal 對象一旦被建立,就可以賦值到HttpContent.Current.User屬性,用來表示當前請求使用者的安全的上下文。
 
       下面就是建立的代碼例子:
       

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

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

 
       注意:上面的代碼是要寫在特定的地方,也就是生命週期的特定的時候的,我們後面講述。
 
       說了Principal,下面就說說使用者標識到底是什麼,之前多次提到的。
 
        二 使用者標識
  
       Identity對象用於標識目前使用者的標識。標識只能提供少量的安全上下文資訊,如使用者名稱。Identity對象可以驗證使用者。
 
       IIdentity介面
       和IPrincipal介面一樣,表示使用者標識的對象都要實現這個介面。IIdentity介面定義了Identity對象的基本額的結構,定義如下:

       AuthenticationType(string類型的)屬性--它可以擷取所使用的身分識別驗證的類型,如,如果使用的Forms驗證,該屬性返回"Forms"字串,所以我們自訂的標識可以返回"CustomIdentity"字串。
       IsAuthenticated(bool類型)屬性--標識使用者是否通過身分識別驗證。我們可以常常用HttpContext.Current.User.Identity.IsAuthenticated來判斷使用者是否已經登入。
 Name(string 類型的)屬性--擷取使用者的名字。相信對HttpContext.Current.User.Identity.Name不陌生。

       下面我們就看看我們自己的實現了IIdentity介面的標識類。

       

 

Code

using System;
using System.Security.Principal;

public class CustomIdentity : IIdentity
{
       private  string name;
        //建構函式只接收一個string參數,大家可以看看之前我們代碼: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;
        }

        //下面就實現介面
        private bool isAuthenticated = false;
        public bool IsAuthenticated
        {
                get { return isAuthenticated; }
        }

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

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

       其實GenericIdentity標識的是一個基本的Identity 對象。它對於Identity對象來說是做基本的。之前我們看過一個GenericPrincipal的例子,在那個執行個體中我們建立一個GenericIdentity類的執行個體,
   

    GenericIdentity identity=new GenericIdentity("xiaoyang"); 

 
       而且我們還可以提供更加具體的Identity對象,如之前提到的FormsIdentity,開提供具體的使用者資訊。
 
       今天就到這裡,希望大家有收穫。
 

        註:轉載要表明出處!

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.