ASP.NET安全问题--ASP.NET安全架构--如何实现.NET安全
2013-03-22 14:46
736 查看
前言:大家是否在用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属性,用来表示当前请求用户的安全的上下文。
下面就是创建的代码例子:
//创建一般的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,开提供具体的用户信息。
今天就到这里,希望大家有收获。
系列文章链接:
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属性,用来表示当前请求用户的安全的上下文。
下面就是创建的代码例子:
//创建一般的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,开提供具体的用户信息。
今天就到这里,希望大家有收获。
相关文章推荐
- ASP.NET安全问题--ASP.NET安全架构--如何实现.NET安全 (转)
- ASP.NET安全问题--ASP.NET安全架构--如何实现.NET安全
- ASP.NET安全问题--ASP.NET安全架构--如何实现.NET安
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
- ASP.NET安全架构--如何实现.NET安全
- ASP.NET安全架构--如何实现.NET安全
- ASP.NET安全问题--ASP.NET安全架构
- ASP.NET三层架构详解 如何实现三层架构
- 在asp.net中如何用LinkBtutton按钮实现安全退出,并保存当前页面数据与数据库中
- 一起谈.NET技术,如何实现ASP.NET网站个性化?
- 高级别问题:如何在ASP.NET大型应用系统的模块化开发实现多版本程序集并存支持
- ASP.NET安全问题--ASP.NET安全架构
- 基于ASP.net C#技术来实现,介绍如何处理Session对象变量失效的问题
- 前面在《Asp.Net Forums中对.Net中序列化和反序列化的应用》一文中讲了,对于一些扩展属性,可以将字符串集合序列化为二进制,也可以从二进制反序列化为字符串集合。其实我一直有个疑问,对于asp.net中可以很容易实现,但是在asp中该如何?
- ASP.NET安全问题--ASP.NET安全架构
- [设计与架构] 如何实现asp.net三层架构
- 如何防止asp.net盗链下载问题的实现方法
- ASP.NET 中如何防范SQL注入式攻击(安全问题 今天你看了吗)
- [设计与架构] 如何实现asp.net三层架构
- ASP.NET安全问题--ASP.NET安全架构