[转]asp.net权限认证:摘要认证(digest authentication)

本文转自:http://www.cnblogs.com/lanxiaoke/p/6357501.html

摘要认证简单介绍

摘要认证是对基本认证的改进,即是用摘要代替账户密码,从而防止明文传输中账户密码的泄露

之前对摘要认证也不是很熟悉,还得感谢圆中的 parry 贡献的博文:ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)

我是觉得真心不错,让我少走很多弯路。这篇文章主要是对上边引用文章的讲解,老司机可以略过。

老规矩,上摘认证的工作流程图

看图大概可以知道摘要认证的步骤

客户端请求资源 api/employees

后台认证逻辑,返回401

数据提交后,服务端检查Headers中的Authorization信息,null值就返回401,提示需要认证,认证格式为Digest,同时返回的还有realm、nonce、qop这几个参数值

1、realm的值可以随意;nonce为随机数,一般是GUID格式的字符串,需要后台返回;qop的之分布有三种:没有定义(即空值)、auth、auth-int

2、后台处理过程:

3、返回的报文头信息是这样:

HTTP /1.1 401 Unauthorized
WWW-Authenticate:Digest
realm= ”RealmOfBadri”
qop=“auth”
nonce=”75d1c31e6d3b28f100edac595a53cf96”

客户端授权开始

接受到反馈后,知道资源需要授权才能访问;于是开始输入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运算

后台参数解析

分析完前端,我们看看服务端如何解析这些参数的

其实服务端的工作就是根据客户端端传送过来的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权限认证系列

  1. asp.net权限认证:Forms认证
  2. asp.net权限认证:HTTP基本认证(http basic)
  3. asp.net权限认证:Windows认证
  4. asp.net权限认证:摘要认证(digest authentication)
  5. asp.net权限认证:OWIN实现OAuth 2.0 之客户端模式(Client Credential)
  6. asp.net权限认证:OWIN实现OAuth 2.0 之密码模式(Resource Owner Password Credential)
  7. asp.net权限认证:OWIN实现OAuth 2.0 之授权码模式(Authorization Code)
  8. asp.net权限认证:OWIN实现OAuth 2.0 之简化模式(Implicit)

分类: 权限认证

时间: 2024-10-16 05:29:05

[转]asp.net权限认证:摘要认证(digest authentication)的相关文章

详解摘要认证

1. 什么是摘要认证 摘要认证与基础认证的工作原理很相似,用户先发出一个没有认证证书的请求,Web服务器回复一个带有WWW-Authenticate头的响应,指明访问所请求的资源需要证书.但是和基础认证发送以Base 64编码的用户名和密码不同,在摘要认证中服务器让客户端选一个随机数(称作"nonce"),然后浏览器使用一个单向的加密函数生成一个消息摘要(message digest),该摘要是关于用户名.密码.给定的nonce值.HTTP方法,以及所请求的URL. 2. 摘要认证算法

asp.net权限认证:摘要认证(digest authentication)

asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证:摘要认证(digest authentication) 一.摘要认证由来 摘要认证是对基本认证的改进,即是用摘要代替账户密码,从而防止明文传输中账户密码的泄露 之前对摘要认证也不是很熟悉,还得感谢圆中的 parry 贡献的博文:ASP.NET Web API(三):安全验证之使用摘要认证(dige

ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)

在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看另一种验证的方式:digest authentication,即摘要认证. 系列文章列表 ASP.NET Web API(一):使用初探,GET和POST数据ASP.NET Web API(二):安全验证之使用HTTP基本认证ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication) 摘要认证原理 在基本认证的方式中,主

[转]asp.net权限认证:HTTP基本认证(http basic)

本文转自:http://www.cnblogs.com/lanxiaoke/p/6353955.html HTTP基本认证示意图 HTTP基本认证,即http basic认证. 客户端向服务端发送一个携带基于用户名/密码的认证凭证的请求.认证凭证的格式为“{UserName}:{Password}”,并采用Base64编码,经过编码的认证凭证被存放在请求报头Authorization中,Authorization报头值类似:Basic MTIzNDU2OjEyMzQ1Ng==.服务端接收到请求之

asp.net权限认证篇外:集成域账号登录

在之前的我们已经讲过asp.net权限认证:Windows认证,现在我们来讲讲域账号登录, 这不是同一件事哦,windows认证更多的是对资源访问的一种权限管控,而域账号登录更多的是针对用户登录的认证,他一般与forms认证结合一起使用 demo就用之前的asp.net权限认证:Forms认证 1.改一下LoginController,如下 1 public class LoginController : Controller 2 { 3 public ActionResult Index()

asp.net权限认证:HTTP基本认证

一.HTTP基本认证示意图 HTTP基本认证,即http basic认证. 客户端向服务端发送一个携带基于用户名/密码的认证凭证的请求.认证凭证的格式为“{UserName}:{Password}”,并采用Base64编码,经过编码的认证凭证被存放在请求报头Authorization中,Authorization报头值类似:Basic MTIzNDU2OjEyMzQ1Ng==.服务端接收到请求之后,从Authorization报头中提取凭证并对其进行解码,最后采用提取的用户名和密码实施认证.认证

Httpclient处理摘要认证

虽然摘要认证的安全性比BASIC认证提高了不少,但是从接口调用上来看,并不比BASIC认证复杂,而且Realm和Scheme参数都可以为空,这时候就和BASIC认证的调用方式一模一样了. import java.net.URI; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.Credentia

HTTP - 摘要认证

基本认证便捷灵活,但极不安全.用户名和密码都是以明文形式传送的,也没有采取任何措施防止对报文的篡改.安全使用基本认证的唯一方式就是将其与 SSL 配合使用. 摘要认证是另一种 HTTP 认证协议,它与基本认证兼容,但却更为安全.摘要认证试图修复基本认证协议的严重缺陷.具体来说,摘要认证进行了如下改下: 永远不会以明文方式在网络上发送密码. 可以防止恶意用户捕获并重放认证的握手过程. 可以有选择地防止对报文内容的篡改. 防范其他几种常见的攻击方式. 摘要认证并不是最安全的协议.摘要认证并不能满足安

Apache-2.2用户权限设置与认证

背景介绍 有时我们使用Apache搭建出来的web站点仅给内部某些主机访问,或者访问时需要通过身份验证后才可以显示,如监控主机的web页面等,此时就需要控制访问者的权限和进行身份验证了,本章就以此来进行介绍 一.用户权限设置 在/etc/httpd/conf/httpd.conf配置文件中,DocumentRoot是指明web站点的根目录所在的路径(默认DocumentRoot "/var/www/html"),而其下的Directory容器中的部分<Directory &quo