1.网站出现form认证不定时认证失败。登陆过后 每隔一会儿就需要重新登陆。首先检查的是form身份认证票据设置的时间(正常) 然后检查加密后的身份认证信息写入的cookie的失效时间(正常)
2.这个时候的想法是服务器是否加了一层代理。导致代理向服务器发送身份认证cookie信息失败,或者是服务器返回身份认证信息cookie 经过代理转发给客户端的时候代理经过包装。第二次发向代理 代理认为失效了 不向上层转发(host内网 排除)
3.在asp.net 事件管道的begin_resquest 打印requset 封装的cookie信息(存在) 在身份认证信息事件管道(第二个事件管道)打印(无效)
4.这个时候发现是asp.net框架对身份认证cookie认证失败。。(票据有效时间过了 排除)
5.了解身份认证原理
登陆时:
1. 检查用户提交的登录名和密码是否正确。
2. 根据登录名创建一个FormsAuthenticationTicket对象。
3. 调用FormsAuthentication.Encrypt()加密。(每次程序启动都会随机生成一个加密字符串。根据这个加密字符串加密和解密)
4. 根据加密结果创建登录Cookie,并写入Response。
每次身份认证:
1. FormsAuthenticationModule尝试读取登录Cookie。
2. 从Cookie中解析出FormsAuthenticationTicket对象。过期的对象将被忽略。(解析是通过 登录时的加密字符串进行解析)
3. 根据FormsAuthenticationTicket对象构造FormsIdentity对象并设置HttpContext.User
4. UrlAuthorizationModule执行授权检查。
6.发现iis的web程序 处理的进程数改成了5个进程
分析:进程之间数据是不能共享的。那么每个进程生成的随机加密字符串都不一样。假如有进程a 和b2个进程 登陆是进程a处理 ,其他请求是进程b处理 通过b的加密字符串解析a的加密字符串加密的身份认证信息(失败) 导致登陆失败
解决 配置web的加密字符串 不使用随机