上一章中讲解了身份验证和授权的概念,它们是构建ASP.NET安全的基础点。在此我就再重复一次这两个概念。
身份验证:提供了如何验证用户的机制。我们可以利用这些机制完成对用户的验证工作。
授权:对资源的可访问性进行设置的一种机制。可以利用它来限制资源可以被那些用户访问。
要想理解ASP.NET安全机制是如何工作我们还需要了解一下什么是安全性控制流。想想我们虽然知道了什么是身份验证什么授权,可并不清楚ASP.NET是怎么利用这些概念的。我们需要了解到对于任何WEB程序而言其实都是简单的请求和相应。比如我发起一个对Default.aspx页面的请求通常情况下,我们会在浏览器中得到相应的html的标记块(这就是“响应”),虽然不是任何时候得到的相应都是HTML但通常来说都是的。这是在没有任何限制的情况下一个请求会导致的结果(响应),可如果default.aspx页面是一个受限的页面,那又会是怎样的?能肯定一点的是,绝对不会像上面那样直接给出一个响应。这就是我为什么要讲解一下安全性控制流的原因。
如果你的ASP.NET程序利用身份验证和授权限制了一些资源的访问。在这种场景中,我们需要搞清楚一下几件事情:
1.如何判读一个请求是针对受限资源的。
2.如果请求的是一个受限资源,那么我们在什么时候确定这个请求可以直接访问资源?
3.如果不能访问一个资源,将要做何种处理。
4.什么时候进行身份验证。
看看下面的图例
上图是安全性控制流的图解。它阐明了当一个请求进入的时候是如何被处理的。你可以在上图上到被标识的A,B,C,D,E,F这样的关键点。我依赖上图解释一下控制流的过程。首先从A点开始。
A点表示一个请求从IIS中导入到一个ASP.NET程序中。ASP.NET程序做的第一件事情就是根据你在配置文件中设置的“授权”节中的信息来判断这个进入的请求是否要求访问一个受限资源。如果这个请求试图访问一个受限资源,那么ASP.NET就会检测一下这个请求是否附加了一个身份验证Cookie。如果没有那么这个请求会被导向到登录页面(也是在配置文件中定义的)。
犹如你去看电影一样,如果你没有票就想进入电影院,你想会发生什么?你只能去售票窗口买票,而如果你有票那当然是没有问题的。
身份验证Cookie : ASP.NET是利用COOKIE来表示一个用户是否是有效用户。这里其实就相当于,一个身份验证Cookie就犹如电影票一样。
A点做的事情有两件
1. 获得请求并根据你在WEB.CONFIG文件的<authorization>配置节的配置来判断当前的请求是否是在请求一个受限资源。
2.如果当前的请求附带了一个身份验证Cookies则可以访问这个资源否则就会被导向到登录页面(B点)。
B点:当一个请求并没有附带一个有效的身份验证COOKIES就会导入到登录页面(B点),这个登录页面是我们在<authentication>的<Forms>节中预设的。
登录页面会收集用户的提供的凭据(一般是用户名或密码),通过对提供的凭据进行验证确定是否在原始的请求上附加一个身份验证COOKIES,然后访问原始请求所请求的资源(也就是原本应该得到的页面)。
原始的请求 :相对而言,你访问的是登录页面,而有可能登录页面不是你最开始请求的。最开始请求的有可能是default.aspx页面。
C点:在收集用户的凭据后就可以根据凭据确定是否给予当前请求一个合法的凭证。比如你可以把收集到的用户名和密码与数据库中的用户表的信息做比较以其额定是否给予凭证或也可以毫无理由的给予凭证。指向说明其实给予用户凭证和验证是否给予凭证的过程完全是两回事。犹如我可以花钱买票也有可能别人送我票,当对于ASP.NET而言只要你有合法的凭证就可以访问你想要访问的资源。
E点:这个点负责是读取配置文件中相关的授权配置并与身份验证凭证做比较,以确定用户是否可以访问资源。不是已经获得了凭证吗?还需要比较什么?在这里之所以要对比授权的信息是因为虽然获得了合法的凭证但并不表示这个凭证就可以任何资源了。想想前面我在说授权的时候描述的。在复杂的ASP.NET程序中,资源可能会被划分成很多的部分,有些部分不是一般合法用户可以访问的也就是说需要更高的权限才能访问的。E点所确定的就是当前获得合法凭证的用户到底有没有权利访问他所请求的资源。
总结一下,对于ASP.NET的安全机制而言,会经历一下几个过程:
1.安全机制会拦截所有的进入的请求并试图判读这个请求是否附带了身份验证COOKIES。在这个阶段安全机制会去读取“授权配置”以便确定该如何对进入的请求进行判断。
2. 没有附加身份验证的COOKIES请求会被重新导向到登录页面以便完成身份验证的过程。在个这过程中安全机制会去读取“认证配置”以便确定该使用什么方式来验证用户。
3.如果身份验证合法,还需要对获得凭证进行验证,看这个凭证是否有足够的权利访问相应的资源。
4.以上如果顺利,那么还需要重定向到原始请求的资源上。在这个阶段安全机制也会读取“授权配置”
请注意一点,以上讲解的是FORMS身份验证中的安全性控制流的过程。