zoukankan      html  css  js  c++  java
  • ASP.NET安全问题ASP.NET安全架构--如何实现.NET安全 (转)

      ASP.NET安全架构--如何实现.NET安全

          

          转自(http://www.cnblogs.com/yanyangtian/archive/2009/05/02/1447753.html

           前言:大家是否在用Forms验证的时候,常常被很多的概念搅混?是否真的明白什么是Principal,Identity,以及IPrincipan...?很多的文献很少提及这些到底是什么,仅仅是怎么用,结果出问题,导致很多的朋友的理解仅仅停在表面,使用起来也是束手束脚。相信看完本篇,会有一定的收获的。

           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属性,用来表示当前请求用户的安全的上下文。
     
           下面就是创建的代码例子:
           


    //创建一般的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接口的标识类。

           







    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,开提供具体的用户信息。
     

  • 相关阅读:
    URAL——DFS找规律——Nudnik Photographer
    URAL1353——DP——Milliard Vasya's Function
    URAL1203——DPor贪心——Scientific Conference
    递推DP HDOJ 5389 Zero Escape
    区间DP UVA 1351 String Compression
    树形DP UVA 1292 Strategic game
    Manacher HDOJ 5371 Hotaru's problem
    同余模定理 HDOJ 5373 The shortest problem
    递推DP HDOJ 5375 Gray code
    最大子序列和 HDOJ 1003 Max Sum
  • 原文地址:https://www.cnblogs.com/shineqiujuan/p/1524250.html
Copyright © 2011-2022 走看看