asp.net权限认证:摘要认证(digest authentication)
asp.net权限认证系列
asp.net权限认证:HTTP基本认证(http basic)
asp.net权限认证:摘要认证(digest authentication)
asp.net权限认证:OWIN实现OAuth 2.0 之客户端模式(Client Credential)
asp.net权限认证:OWIN实现OAuth 2.0 之密码模式(Resource Owner Password Credential)
asp.net权限认证:OWIN实现OAuth 2.0 之授权码模式(Authorization Code)
asp.net权限认证:OWIN实现OAuth 2.0 之简化模式(Implicit)
一、摘要认证由来
摘要认证是对基本认证的改进,即是用摘要代替账户密码,从而防止明文传输中账户密码的泄露
之前对摘要认证也不是很熟悉,还得感谢圆中的 parry 贡献的博文:ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)
我是觉得真心不错,让我少走很多弯路。这篇文章主要是对上边引用文章的讲解,老司机可以略过。
老规矩,上摘认证的工作流程图
看图大概可以知道摘要认证的步骤
1、客户端请求资源 api/employees,项目中即是点击details按钮
2、数据提交后,服务端检查Headers中的Authorization信息,null值就返回401,提示需要认证,认证格式为Digest,同时返回的还有realm、nonce、qop这几个参数值
2.1、realm的值可以随意;nonce为随机数,一般是GUID格式的字符串,需要后台返回;qop的之分布有三种:没有定义(即空值)、auth、auth-int
2.2、后台处理过程:
2.3、返回的报文头信息是这样:
HTTP /1.1 401 Unauthorized
WWW-Authenticate:Digest
realm= ”RealmOfBadri”
qop=“auth”
nonce=”75d1c31e6d3b28f100edac595a53cf96”
3、客户端接受到反馈后,知道资源需要授权才能访问;于是开始输入username、password
这里有个地方需要注意,项目默认是账户名密码一致才能验证通过的,看代码
点击登录,查看后台得到的数据
看图可以知道
realm、qop、nonce是服务器上次生成的值
username是我们输入的页面
uri是客户端要请求的地址
nc、cnonce是客户端自动生成的值
response是最终要传送的摘要信息,也是客户端生成的
是不是发现了什么不对?密码去哪了?
其实这就是摘要认证的精髓了,不传送明文密码,只传送摘要信息
有同学可能要问,不传输密码,那服务端如何知道输入的用户名称就是属于当前操作用户呢
那接下来就得摘要信息出场了,我们来看看如何生成摘要信息
对(username:realm:password)进行HASH运算,得到HA1
对(方法名:请求的路径)进行HASH运算,即(GET:http://localhost:32934/api/employees),得到HA2
最终得到摘要信息response = 对(HA1:nonce:nc:cnonce:qop:HA2)进行HASH运算
4、分析完前端,我们看看服务端如何解析这些参数的
其实服务端的工作就是根据客户端端传送过来的realm、qop、nonce、username、uri、nc、cnonce进行HASH运行得到新的摘要信息response2
如何用response2与客户端生成的response进行比较,如果一致,就说明认证通过;不一致,就继续返回401
主要就是这一段代码处理
因为对于服务端来说HA1:nonce:nc:cnonce:qop:HA2中除了HA1中的password没有从客户端得到,其他所有所有参数都得到了
所以摘要认证的核心就是:
对于客户端:我知道用户名称和密码和(一些认证的约束,即realm、qop、nonce之类),从而得到加密信息response
对于服务端:我知道用户名称和(一些认证的约束,即realm、qop、nonce之类),然后根据用户名称去数据库找到用户的密码,从而得到加密信息response2
最后比较response:response2,如果客户端输入的密码和数据库根据用户名称查到的密码一致,就肯定能认证通过。
最后需要提醒大家的地方,这个用户密码可以跟账号登录密码不一致,可以分成2个字段;你可以理解为:用户名+认证密码
因为认证密码即使是加密的也必须可逆,不然后台匹配不了
二、摘要认证测试
好了,web端的摘要认证就是上边那样。
但是很多情况客户端不是通过浏览器访问的资源,比如通过一段程序去访问 api/employees,
这时候并不存在像浏览器弹出认证窗口的交互动作,这时候怎么搞?
其实也是很简单的,我们新建控制台项目 DigestTest
然后通过WebClient对象去访问资源文件
最后运行程序,就可以看到返回的数据
提示未经授权,因为我们的认证账户是错的,改成1111:1111,再试试
OK,完全没有问题
好了,搞定收工!
asp.net权限认证:摘要认证(digest authentication)的更多相关文章
- Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结
Atitit HTTP认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结 1.1. 最广泛使用的是基本验证 ( ...
- [转]asp.net权限认证:摘要认证(digest authentication)
本文转自:http://www.cnblogs.com/lanxiaoke/p/6357501.html 摘要认证简单介绍 摘要认证是对基本认证的改进,即是用摘要代替账户密码,从而防止明文传输中账户密 ...
- [转]ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)
本文转自:http://www.cnblogs.com/parry/p/ASPNET_MVC_Web_API_digest_authentication.html 在前一篇文章中,主要讨论了使用HTT ...
- ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)
在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看另一种验证的方式:digest authentication,即摘要认 ...
- 安全验证之使用摘要认证(digest authentication)
安全验证之使用摘要认证(digest authentication) 在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看 ...
- Digest Authentication 摘要认证
“摘要”式认证( Digest authentication)是一个简单的认证机制,最初是为HTTP协议开发的,因而也常叫做HTTP摘要,在RFC2671中描述.其身份验证机制很简单,它采用杂凑式(h ...
- ASP.NET Web API 安全验证之摘要(Digest)认证
在基本认证的方式中,主要的安全问题来自于用户信息的明文传输,而在摘要认证中,主要通过一些手段避免了此问题,大大增加了安全性. 1.客户端匿名的方式请求 (无认证) HTTP/ Unauthorized ...
- asp.net权限认证:Windows认证
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- asp.net权限认证:Forms认证
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
随机推荐
- (简单) HDU 2612 Find a way,BFS。
Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Nin ...
- linux下配置ip地址四种方法(图文)
(1)Ifconfig命令 第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig ethx i ...
- CSS实现导航条Tab切换的三种方法
前面的话 导航条Tab在页面中非常常见,本文说详细介绍CSS实现导航条Tab的三种方法 布局 根据上图所示,先规定几个定义,上图的模块整体叫做导航,由导航标题和导航内容组成.要实现上图所示的布 ...
- javascript--hasOwnProperty()+isPrototypeof()+in方法
1.hasOwnProperty():用来检测对象中是否包含给出的函数属性或者对象,但是无法检测出对象的原型链中是否包含给出的属性或对象--该属性或者对象必须在函数内部被声明 2.isPrototyp ...
- Bzoj3756
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3756 题解:乱搞 代码: #include<iostream> #include ...
- KMP之我见
第二次看kmp,才有点搞懂这个算法(我真是太弱了,就该orz陈老师和龙老师): kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法 ...
- Html emed 和 object
<object> 标签用于包含对象,比如图像.音频.视频.Java applets.ActiveX.PDF 以及 Flash. object 的初衷是取代 img 和 applet 元素. ...
- python 自动化之路 day 13
本节内容参考博客: http://www.cnblogs.com/wupeiqi/articles/5132791.html http://www.cnblogs.com/wupeiqi/articl ...
- js架构设计模式——MVVM模式下,ViewModel和View,Model有什么区别
MVVM模式下,ViewModel和View,Model有什么区别 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就 ...
- js原生封装getClassName()方法-ie不支持getElementsByClassName,所以要自己实现获取类名为className的所有元素
<html> <head> <script type="text/javascript"> window.onload = function() ...