Part V: Securing ASP.NET Applications
CHAPTER 19 Using Forms-Based Authentication
Forms认证和Passport认证都是需要cookie支持的,两者区别在于
Forms认证可以使开发员对用户名和密码保进行自定义存储,例如web.config文件、xml文件或者database表
Passport认证利用了MS的Passport认证,是一种集中处理认证的方式,可以一次登录,保证同一个用户名和密码在多个web站点也有效
19.1 Working with Forms Authentication
Forms认证的优点就在于可以把用户名和密码按照自己的意愿存放在任何位置
Forms认证需要浏览器的cookie支持,以便甄别用户
关于Forms认证的类位于System.Web.Security命名空间下面,最重要的几个类是,
FormsAuthentication,包含了几个和Forms认证一同工作的方法
FormsAuthenticationTicket,代表了在Forms认证中,只用在cookie内的认证票据
FormsIdentity,代表了通过使用Forms认证后,被认证用户的标识
FormsAuthenticationModule,这个类是在Forms认证中的一个使用的模块
Enabling Forms Authentication
为了能够使用Forms认证,必须完成几个步骤,
在Web.config文件的authentication section设置认证模式,mode="Forms"
在Web.config文件的authorization section设定禁止对应用程序的目录进行匿名访问 deny users="?"
创建登陆页面,允许用户输入用户名和密码
在登陆页面,使用FormsAuthentication.RedirectFromLoginPage()方法,来进行重定向回进入登陆页面之前的被访问页面。
FormAuthentication.RedirectFromLoginPage()方法,完成了两件事情,
第一,根据传入的参数,创建临时或者永久的cookie
第二,把用户返回到在进入登陆页面之前的被访问页面
Configuring Forms Authentication
web.config文件的authentication section可选的子节点是forms,forms可以如下几个属性,
loginUrl,如果需要认证,用户被自动重定向的登陆页面的URL地址
name,包含认证票据的浏览器cookie的名字
timeout,cookie过期的时间,默认30分钟。不适用于persistent cookie
path,使用到cookie的路径,默认是/
protection,保护cookie数据的方法,可以选择值有All/None/Encryption/Validation,默认是All
Configuring Forms Authorization
web.config文件中,authorization section可以包含deny子节点和allow子节点
deny和allow子节点的属性有
verbs,用于控制用户是否可以使用HTTP协议的Post或者Get
users,使用*代表所有用户,使用?代表匿名用户
Retrieving User Information
使用FormsIdentity类的属性,可以识别认证用户的信息
FormsIdentity.AuthenticationType,对于Forms认证的用户总是返回Forms
FromsIdentity.IsAuthenticated,表明用户是否认证通过
FormsIdentity.Name,代表了被认证用户的名字
FormsIdentity.Ticket,确定了和当前用户相关的cookie认证票据
FormsIdentity.Ticket属性返回了用户相关的cookie认证票据,使用FormsAuthenticationTicket类可以获得其他有的信息,
FormsAuthenticationTicket.CookiePath,认证票据cookie的路径
FormsAuthenticationTicket.Expiration,认证票据cookie过期的日期
FormsAuthenticationTicket.Expired,bool值,表明当前认证票据是否已经过期
FormsAuthenticationTicket.IsPersistent,用户表明认证票据是否包含在persistent cookie中
FormsAuthenticationTicket.IssueDate,包含认证票据的cookie创建的日期时间
FormsAuthenticationTicket.Name,和认证票据相关的用户名
FormsAuthenticationTicket.UserData,开发员自定义的,包含在认证票据中的自定义数据
FormsAuthenticationTicket.Version,一个整数值,代表了认证票据的版本号码。现在,默认情况下,这个属性总是返回1
Creating a Sign-Out Page
如果允许退出登录,编程匿名人士,可以使用FormsAuthentication.SignOut()方法,使用FormsAuthentication.SighOut()方法可以删除会话cookie或者persistent cookie
Authenticating Users with the Web.Config File
Forms认证的一个巨大优点就是把可以把用户名和密码按照自己的意愿存放在任何位置,例如,可以存放在web.config中,
形如<forms> <credentials passwordFormat="Clear" > <user name="tom" password="tom" /> </credentials> </forms>
就是把用户名和密码存放在了web.config文件中,通过再在authorization中禁止匿名访问,就可以达到必须是用户名是tom,密码也是tom的人才能够访问本站点
通过使用FormAuthentication.Authenticate()方法,可以确定给定的用户名和密码是否在web.config文件中
Encrypting Passwords in the Web.Config File
在上例中,因为密码是明文书写在了web.config文件中,很危险,通过指定credentials的passwordFormat属性为某一个加密算法,并且把明文的password属性值更改为加密后的值,就可以减小一些危险
那么,使用加密算法,有一个问题就是在FormsAuthentication.Authenticate()方法中,就无法达到匹配的目的,因为密码是加密过的,而用户输入的密码是一个明文,怎么解决问题呢,使用FormsAuthentication.HashPasswordForStoringInConfigFile()方法来完成,而不再使用FormsAuthentication.Authenticate()方法了
Authenticating Users with an XML File
除了在web.config文件中存储用户名和密码,也可以把用户名和密码放在单独的XML文件中
书上例子,放在了Passwords.xml文件中,为了能够完成把用户名和密码单独存储在xml文件的目的,需要创建四个文件
Web.config,包含了认证和授权的配置信息
Passwords.xml,存储了用户名和密码的文件
Login.aspx,验证用户名和密码,验证的依据就是passwords.xml文件
Register.aspx,允许用户名在站点进行注册,从而向Passwords.xml文件中新增用户名和密码
web.config文件不必多讲,就是在授权部分禁止了匿名访问
Passwords.xml文件中,都是形如<Passwords> <user> <name>Tom</name> <password>tom</password> </user> </Passwords>的格式
在Login.aspx文件中,就是使用DataSet读取Passwords.xml,然后拿用户输入的用户名和密码与每一条记录进行对比,有的话呢,就是FormsAuthentication.RedirectFromLoginPage()方法
在Register.aspx文件中,还是使用DataSet读取Passwords.xml,然后拿用户输入的用户名和密码与每一条记录对比,有的话,就是有重复,让用户重新输入,没有呢,就插入到DataSet中,然后调用FormsAuthentication.RedirectFromLoginPage()方法
Authenticating Users with a Database Table
相较于存储在web.config和一个xml文件中,存储在数据表里面是更常用的办法,这个时候使用DataTable代表了数据表,然后使用和上面的存储在xml文件中类似的办法完成用户登陆和注册就可以了
Implementing Roles-based Authentication
很多的时候,需要把用户进行分角色,以便授予他们不同的权限,例如bbs中,有斑竹,有管理员,有普通注册用户
为了能够给用户分角色,需要在Global.asax文件的Application_AuthenticateRequest()方法中进行编码,例如,
String[] arrRoles = new String[] {"Supervisors", "Users"};
Context.User = New GenericPrincipal( Context.User.Identity, arrRoles );
上面的两句代码,就是把当前用户分配到"Supervisors"和"Users"角色中了
或者通过使用一个xml文件记录了用户所在的角色,然后在Application_AuthenticateRequest()方法中,根据用户名找到他所属于的角色,并分配给当前用户。如果角色、用户信息存储在数据库中,也是一样的做法
Creating a Custom Authentication Ticket
Forms认证使用了存储在cookie中的认证票据来完成用户认证工作的。认证票据是在FormsAuthentication.RedirectFromLoginPage()方法的时候自动创建并添加到浏览器当中的
一般来讲,认证票据中的信息是足够用了。如果不够用,可以手动增加一个认证票据,放在浏览器中,例如,你想增加某些需要的自定义信息,可以创建一个FormsAuthenticationTicket类的实例,并在这个实例的userData属性中增加自定义的信息
Using Forms Authentication and Web Farms
默认情况下,不能够在多个服务器之间共享认证票据cookie,因为每个服务器会自动产生他自己的key,所以,如果想要共享认证票据cookie,必须在machine.config或者web.config文件中声明如下的内容:
<machineKey validationKey="AutoGenerate, IsolateApps" decryptionKey="AutoGerate, IsolateApps" validation="SHA1" />
19.2 Working with Passport Authentication
Enabling Passport Authentication
Enabling Users to Sign In and Sign Out
Retrieving User Information
心情不好,懒得看了,可能很有用,用的时候再说吧
CHAPTER 20 Using Windows-Based Authentication
20.1 Working with Windows Authentication
使用基于windows帐户的验证适合在内部网使用,每一台机器有一个帐号,可以使用集成域控制器上面的账号进行安全验证
20.2 Impersonating User Accounts
20.3 Setting Security Policies
心情不好,懒得看了,可能很有用,用的时候再说吧
CHAPTER 21 Encrypting Data over the Network
这部分讲解了SSL这个安全的协议的情况,需要的时候再看了
21.1 Using the Secure Sockets Layer
21.2 Configuring Your Server to Use SSL
21.3 Using SSL in ASP.NET Pages
21.4 Using .NET Encryption Classes