Asp.Net Form验证不通过,重复登录(.net4,4.5form验证兼容性问题)

问题产生根源:

当然,其实应该需要保持线上所有机器环境一致!可是,写了一个小程序。使用的是4.5,aysnc/await实在太好用了,真心不想把代码修改回去。

so,动了念头,在这台服务器上装个4.5,ms不是说了么,4.5和4.0是高度兼容的。。。。。。

问题现象:

一台服务器在安装.net framework 4.5 之后,在该服务器所部署的网站(使用.net framework 4,未修改任何配置,分布式环境),

网站在这台服务器上登录之后,打开其他服务器的任何站点,form验证过不去,导致重复登录,反之亦然.

问题分析:

为什么会导致重复登录问题?

很简单能推断出是在这个机器上安装了4.5 ,某些组件的变动,导致form验证的加解密方式有变动.使得2台机器生成的登录cookie内容不一致,不能相互解析.

能影响到.net对form加解密产生不同作用的地方无非2个.

1.本身代码的bug,兼容性问题问题。

2.配置影响(如web.config中的authentication,machineKey等).

1嘛,基本不可能,ms没这么渣,那就只能从2下手,但是具体什么配置影响到,就不得而知了.

通过参数配置,如果有改变,那对加解密产生的改变都是相符的. so,我们分析一下加密的方法,找出不同,通过参数来兼容这些修改.那问题就解决了.

form验证相关的方法,都在System.Web.Security.FormsAuthentication中.

通过调用加密方法在4.5上生成加密字符串,丢到4.0的机器上解密,不通过,提示加密字符串验证不通过.

so,我们看看加密方法中做了什么

加密方法:

省略部分代码,剩下的关键代码。

public static string Encrypt(FormsAuthenticationTicket ticket)
{
    return Encrypt(ticket, true);
}
internal static string Encrypt(FormsAuthenticationTicket ticket, bool hexEncodedTicket)
{
    byte[] clearData = MakeTicketIntoBinaryBlob(ticket);
        if ((_Protection == FormsProtectionEnum.All) || (_Protection == FormsProtectionEnum.Encryption))
        {
            clearData = MachineKeySection.EncryptOrDecryptData(true, clearData, null, 0, clearData.Length, false, false, IVType.Random);
        }
    }
    return CryptoUtil.BinaryToHex(clearData);
}

然后我们继续深入到MakeTicketIntoBinaryBlob中查看

private static byte[] MakeTicketIntoBinaryBlob(FormsAuthenticationTicket ticket)
{
    if (!AppSettings.UseLegacyFormsAuthenticationTicketCompatibility)
    {
        return FormsAuthenticationTicketSerializer.Serialize(ticket);
    }
  ........................
}

对比4,4.5中MakeTicketIntoBinaryBlob方法代码,发现4.5的源代码中多了AppSettings.UseLegacyFormsAuthenticationTicketCompatibility这么一个开关配置.

系统默认值为flase,so.在4.5中得到的加密字符串来自FormsAuthenticationTicketSerializer.Serialize(ticket).而4中是在后续代码中.

so,增加配置<add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" /> 兼容到这部分.

然后,我们继续看MachineKeySection.EncryptOrDecryptData(true, clearData, null, 0, clearData.Length, false, false, IVType.Random);

internal static byte[] EncryptOrDecryptData(bool fEncrypt, byte[] buf, byte[] modifier, int start, int length, bool useValidationSymAlgo, bool useLegacyMode, IVType ivType)
{
    return EncryptOrDecryptData(fEncrypt, buf, modifier, start, length, useValidationSymAlgo, useLegacyMode, ivType, !AppSettings.UseLegacyEncryption);
}

很熟悉,又看到!AppSettings.UseLegacyEncryption开关配置.进入EncryptOrDecryptData方法中能看到这个参数影响到使用不同的加密方式.

同上,增加配置<add key="aspnet:UseLegacyEncryption" value="true" />兼容到这部分.

再次调用Encrypt方法生成加密字符串,丢到4.0机器上.哇,能解密成功了.

当然,实际解决起来,走了不少弯路,周五晚上发现问题,查了一晚上,未果,但是有思路了.后又周一查了2个小时,终于搞定这个问题.

相关说明:

有关安全更新 2638420 的部署指南,请参见 MS11-100

如何配置 ASP.NET 中的旧加密模式

看了上面一个,好傻...如果发现问题的时候,之后搜索asp.net 旧加密方式. 马上解决...

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

一款隐藏嵌入式Rookit的DDoS木马分析

该款木马分析文章在2015年由@PETER KÁLNAI 最先发表于AVAST的公开blog中,木马的架构严谨,设计精良,应该是产业化的一部分。接下来我们就来看...

29770
来自专栏架构师之路

应用层/安全层/传输层如何进行协议选型?

系统设计,协议先行。 大部分技术人没有接触协议的设计细节,更多的是使用已有协议进行应用层的编码,例如: (1)使用http作为载体,设计get/post/coo...

42950
来自专栏FreeBuf

网站管理软件 – AspxSpy2014 Final

受bin牛委托修改并发布,版权归bin牛所有。 Bug/建议提交:zcgonvh@rootkit.net.cn 祝各位马年大吉,财源滚滚。 免责声明: 本程序只...

39290
来自专栏python爬虫实战之路

Python爬虫-百度模拟登录(二)

参数值都看到了,token、tt、dv、callback这些变化的参数我们都知道了吧,其他的参数固定,别问我为什么。这个logincheck注意到了吗?是不是有...

19330
来自专栏友弟技术工作室

密码机制

djeqtdyy-joao-silas 今天主要是介绍的内容是,一般网站,或应用,在用户注册后,用户的密码如何保存在数据库中,当然,肯定不是明文的.只有当事人知...

38690
来自专栏Linux驱动

30.Linux-RTC驱动分析及使用

 linux中的rtc驱动位于drivers/rtc下,里面包含了许多开发平台的RTC驱动,我们这里是以S3C24xx为主,所以它的RTC驱动为rtc-s3c....

32880
来自专栏小樱的经验随笔

CTF---安全杂项入门第二题 A记录

A记录分值:20 来源: sammie 难度:中 参与人数:2255人 Get Flag:566人 答题人数:621人 解题通过率:91% 他在看什么视频,...

497140
来自专栏小鄧子的技术博客专栏

【译】RxJava中的事件广播

如果你想多点传播一个事件,也就是向所有的下游操作符或订阅者发送同一个事件。这在做耗时操作如网络请求等场景来讲是非常有用的。你不需要为每个订阅者做重复的网络请求,...

10930
来自专栏小樱的经验随笔

CTF---安全杂项入门第三题 这是捕获的黑客攻击数据包,Administrator用户的密码在此次攻击中泄露了,你能找到吗?

这是捕获的黑客攻击数据包,Administrator用户的密码在此次攻击中泄露了,你能找到吗?分值:30 来源: 2014sctf 难度:难 参与人数:3918...

42590
来自专栏Linux驱动

Nand Flash驱动(实现初始化以及读操作)

本节来学习裸机下的Nand Flash驱动,本节学完后,再来学习Linux下如何使用Nand Flash驱动 Linux中的Nand Flash驱动,链接如下:...

69050

扫码关注云+社区

领取腾讯云代金券