关于Asp.Net Forms身份认证

时间:2023-03-09 16:42:11
关于Asp.Net Forms身份认证

  Asp.Net管道式的构建个我们提供了通过IHttpMoudle来订阅管线事件来达到干预HTTP请求的目的,Asp.Net的身份认证正是通过此种方式来对请求来执行身份认证的,这篇文章仅仅谈论FormsAuthenticationModule的Forms身份认证。

  地球人知道,HTTP协议是无状态的一个协议,那么什么是无状态的呢?对于Web服务器来说,对于一个浏览器发出的多次请求,WEB服务器无法区分是不是来源于同一个浏览器,服务器会将客户端每一次请求都当做是一次新的请求来对待,即使该请求是由同一个网站的同一个页面分别发起的。那么服务器是怎么知道当前请求是已经验证通过的合法登陆用户呢?既然服务器不能证明,那么这件事就必须由客户端来证明,就好比我们乘客进站一样必须凭票进站,有了车票的乘客就可以通过检票,检票的操作就是由FormsAuthenticationModule来提供。那么现在什么问题来了?当然不是挖掘机问题!是乘客的票据从哪里来的问题嘛!

  每一次客户端浏览器发起请求与服务器交互时,都会有一小段文本消息伴随着用户请求和页面在 Web 服务器和浏览器之间传递,服务器也可以通过响应来操作它,这段文本就是Cookie了,机智的人们马上就发现了通过它来携带票据是再合适不过的了,当然,Asp.Net也就是这么做的。

  当一次请求到达AuthenticationRequest阶段时,FormsAuthenticationModule会检查传入过来的Cookie,然后尝试从Cookie中解析出FormsAuthenticationTicket对象,若解析到的对象不为空,且没有过期,那么证明该用户是已经登录了系统的用户,如果开启了滑动过期时间,还会重新构建一个票据来覆盖先前的票据。这个时候会创建一个用户对象FormsIdentity,并包装到GenericPrincepal设置给Context.User.这样当前请求上下文就有了用户对象了。那么这个Cookie的名字叫什么呢?默认情况下为.ASPXAUTH,我们也可以配置Web.config/system.web/authentication/forms中来指定名称name.到此大致的认证过程已经结束了。这是对票据认证的过程。当我们第一次登陆系统时,会存在保持票据到客户端由下次携带的过程。这里FormsAuthentication.SetAuthCookie就提供了这样一个接口供我们调用,该方法的实质是将用户名和密码通过写入cookie的方式存储到客户端。有人或许会问?这样安全吗?当然安全,如果不安全微软也不能这样用这么多年了,写入cookie前会将用户名和密码做一次加密操作,默认情况下秘钥与每次回话有关,请加密key是根据回话来取得的,所以客户端很难模拟这样的一个秘钥。

  身份认证完毕后,接着是授权了,对于登陆页面来说,因为不管是否是登陆用户,都允许访问,为此在检测到时登陆页是,会设置HttpContext.SkipAuthorization=true来跳过认证。所以登陆页每次都可以访问。

  第一次写博客,发现好麻烦,希望以后坚持下去。