在实际的系统中,往往要自定义基于数据库的认证系统,比如你的WebService要给你的供应商或者客户调用,你要管理他们的账号和权限。显然基于证书、Windows和Passport的验证都不理想,ASP.net中支持自定义的只有Form认证。我们知道Fom认证要在网络中传输明文密码,要安全只有依靠SSL通讯。
上面提到的几种认证方式都是Asp.net原生的,可以利用IPrincipal。.Net中有四种方式可以利用IPrincipal作权限检查, 在Web设定和代码中都很方便。
怎么增加更安全的登录方式,又能利用IPrincipal呢?
第一种:传送加密后的密码。
定义一个Login WebService, 当然是允许匿名访问的。比较用户提交的Hash过的密码,成功后调用System.web.security.FormsAuthentication中的静态方法来登录,设定认证Cookie给客户端。在后续用户请求时根据Cookie判断用户是否登录过。
优点:
密码一次Hash,计算量少
缺点:
要求WS客户端使用Cookie(问题不大)
安全性不强,如果有人侦听到加密后的密码,可以模仿攻击
第二种:利用摘要认证(Digest Authentication)
在IIS中文摘认证只能基于Windows账户,包括基本认证,给人的错觉是他们是Windows家族的,你要用安全的认证方式,必须用Windows账号。实际上他们是rfc2617标准,没有必要和Windows账户绑定。
在asp.net中实现摘要认证需要利用Filter概念,类似ISAPI.
优点:
可以同时用于aspx和asmx的保护
可以利用浏览器的密码保存和Session管理。
安全性强
缺点:
每次访问都要多次计算Hash
需要客户端支持摘要认证(似乎也不是问题)
实际上以上两种认证方式可以合并在一个模块中,根据需要灵活选用。
参考资料:
http://blog.joycode.com/zjf/posts/16737.aspx
http://www.eggheadcafe.com/articles/20030701.asp
http://gensystem.europe.webmatrixhosting.net/al/articles/147.aspx
悬案问题:
摘要认证怎么Logout?
Ream是用户无关的?
HttpHeader中文乱码
身份传递
上面提到的几种认证方式都是Asp.net原生的,可以利用IPrincipal。.Net中有四种方式可以利用IPrincipal作权限检查, 在Web设定和代码中都很方便。
怎么增加更安全的登录方式,又能利用IPrincipal呢?
第一种:传送加密后的密码。
定义一个Login WebService, 当然是允许匿名访问的。比较用户提交的Hash过的密码,成功后调用System.web.security.FormsAuthentication中的静态方法来登录,设定认证Cookie给客户端。在后续用户请求时根据Cookie判断用户是否登录过。
优点:
密码一次Hash,计算量少
缺点:
要求WS客户端使用Cookie(问题不大)
安全性不强,如果有人侦听到加密后的密码,可以模仿攻击
第二种:利用摘要认证(Digest Authentication)
在IIS中文摘认证只能基于Windows账户,包括基本认证,给人的错觉是他们是Windows家族的,你要用安全的认证方式,必须用Windows账号。实际上他们是rfc2617标准,没有必要和Windows账户绑定。
在asp.net中实现摘要认证需要利用Filter概念,类似ISAPI.
优点:
可以同时用于aspx和asmx的保护
可以利用浏览器的密码保存和Session管理。
安全性强
缺点:
每次访问都要多次计算Hash
需要客户端支持摘要认证(似乎也不是问题)
实际上以上两种认证方式可以合并在一个模块中,根据需要灵活选用。
参考资料:
http://blog.joycode.com/zjf/posts/16737.aspx
http://www.eggheadcafe.com/articles/20030701.asp
http://gensystem.europe.webmatrixhosting.net/al/articles/147.aspx
悬案问题:
摘要认证怎么Logout?
Ream是用户无关的?
HttpHeader中文乱码
身份传递