zoukankan      html  css  js  c++  java
  • asp.net权限认证:摘要认证(digest authentication)

    摘要认证简单介绍

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

    之前对摘要认证也不是很熟悉,还得感谢圆中的 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,完全没有问题

  • 相关阅读:
    kuangbin带你飞 并查集 题解
    kuangbin带你飞 最短路 题解
    kuangbin带你飞 后缀数组 题解
    Kuangbin 带你飞-线段树专题 题解
    HDU 4578 Transformation
    Tarjan & LCA 套题题目题解
    Dancing Links [Kuangbin带你飞] 模版及题解
    二分匹配 大白例题虽有代码
    编程范式:响应式编程
    编程结构:Promise和Future
  • 原文地址:https://www.cnblogs.com/jiangshuai52511/p/10695958.html
Copyright © 2011-2022 走看看