网站需要标示用户登陆状态时,使用cookie便够了;原则上,我是反对使用session的。
直接把登陆用户的ID写入cookie,做为识别即可。但需要注意的是,这个cookie的值必须签名或者是加密,防止伪造。
很多web框架,比方说django,都有内置的签名cookie支持,直接response.set_sign_cookie即可。
Asp.Net很多方面都挺优秀的,但比较诡异的是,不论是System.Web命名空间下还是asp.net MVC貌似都没提供相关的支持。google了一圈,也没发现啥好用的cookie实现。
well,自己动手,丰衣足食。
签名这事可以很简单,value + hex(md5(secret key + salt + value))
也是可以的。
但这是终归涉及系统账号安全,还是使用业界通用的标准比较好。
那就移植Django的签名实现吧,反正也没多少代码。
然后就有了:https://github.com/Wuvist/NDjangoSignCookie
直接nuget Install-Package NDjangoSignCookie
可用。
全部源码加注视空行排版等一共126行,基本一次完成编码并调试成功。
参考的是django 1.6.x版本的cookie签名实现,但估计应该很多版本都是兼容的,这块django应该不会怎么变动才对。我就懒得去试的。
使用与Django完全一模一样的签名方法,实际上还顺便解决了一个潜在需求:
asp.net子站与Django子站共享登陆
比方说, login.65dg.me 是用asp.net开发的,.net这边在用户登陆后,用SetSignCookie(...)方法保存用户id去.65dg.me
根域名下。
然后, help.65dg.me 是用django开发的,它就可以直接使用request.get_sign_cookie(..)方法来获得asp.net签名的cookie,检查用户是否登陆。
反过来,django端写cookie,asp.net这边读也行。
当然,两边得配置使用相同的SECRET_KEY。
最后,做为一个前python粉丝,我这次翻django源码的时候,翻到:
https://github.com/django/django/blob/stable/1.6.x/django/utils/six.py
时,真心只能一声叹息。为了兼容python 2/3,晦涩,又得写一堆无聊的代码……这种搞法,哪有什么开发效率可言?唉~