asp.net form身份认证不定时认证失败的问题 排查

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的加密字符串 不使用随机

上一篇:flutter_hybird_webview 跨进程渲染的实践技术分享


下一篇:搞定PHP面试 - 深入了解引用