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

发布时间:2026/8/3 19:07:43

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)摘要认证原理在基本认证的方式中主要的安全问题来自于用户信息的明文传输而在摘要认证中主要通过一些手段避免了此问题大大增加了安全性。下图为摘要验证的验证原理流程图。下面大致看一下这部分的验证流程客户端请求 /api/employees服务端返回401未验证的状态并且在返回的信息中包含了验证方式Digestrealm的值QOP(quality of protection)只设置成authnonce为一串随机值在下面的请求中会一直使用到当过了存活期后服务端将刷新生成一个新的nonce值客户端接受到请求返回后将username:realm:password进行HASH运算假设运算后的值为HA1。又将请求的路径/api/employees进行HASH运算假设运算后的值为HA2。再将HA1:nonce:nc:cnonce:qop:HA2进行HASH运算得到的值放在response中。这里的cnonce为客户端生成的nonce值而nc用于统计假设开始时为00000001下次请求后就变成了00000002不一定每次都加1但是后面请求中的nc值肯定大于前一次请求中的nc值。服务端收到请求后将验证nonce是否过期如果过期那么直接返回401即第二步的状态。如果没有过期那么比较nc值如果比前一次nc值小或者前一次根本没有存储的nc值那么也将直接返回401状态。如果前面的验证都通过那么服务端也将按照步骤3中计算最终HASH值的步骤计算出HASH值与客户端的进行比较然后比较客户端提交过来的HASH值与服务端计算出来的HASH进行比较不匹配返回401匹配获取请求的数据并返回状态200。摘要验证主要就是通过上面的HASH比较的步骤避免掉了基本验证中的安全性问题。需要注意的是如果需要IIS支持摘要验证需要把IIS摘要验证的特性勾上。摘要验证的实现在理解了摘要验证的原理之后只需要用代码实现即可。判断nonce是否过期的方法。1publicstaticboolIsValid(stringnonce,stringnonceCount)2{3Tupleint, DateTime cachedNonce null;4nonces.TryGetValue(nonce,outcachedNonce);56if(cachedNonce !null)//nonce is found7{8//nonce count is greater than the one in record9if(Int32.Parse(nonceCount) cachedNonce.Item1)10{11//nonce has not expired yet12if(cachedNonce.Item2 DateTime.Now)13{14//update the dictionary to reflect the nonce count just received in this request15nonces[nonce] newTupleint, DateTime(Int32.Parse(nonceCount),16cachedNonce.Item2);1718//Every thing looks ok - server nonce is fresh and nonce count seems to be19//incremented. Does not look like replay.20returntrue;21}22}23}2425returnfalse;26}判断nonce是否过期的代码下面为摘要验证实现的核心方法1namespaceDigestAuthentication2{3publicclassAuthenticationHandler : DelegatingHandler4{5protectedasyncoverrideTaskHttpResponseMessageSendAsync(HttpRequestMessage request, CancellationToken cancellationToken)6{7try8{9varheaders request.Headers;10if(headers.Authorization !null)11{12Header header newHeader(request.Headers.Authorization.Parameter,13request.Method.Method);1415if(Nonce.IsValid(header.Nonce, header.NounceCounter))16{17//Just assuming password is same as username for the purpose of illustration18stringpassword header.UserName;1920stringha1 String.Format({0}:{1}:{2}, header.UserName, header.Realm,21password).ToMD5Hash();2223stringha2 String.Format({0}:{1}, header.Method, header.Uri).ToMD5Hash();2425stringcomputedResponse String26.Format({0}:{1}:{2}:{3}:{4}:{5},27ha1, header.Nonce, header.NounceCounter,28header.Cnonce,auth, ha2).ToMD5Hash();2930if(String.CompareOrdinal(header.Response, computedResponse) 0)31{32//digest computed matches the value sent by client in the response field.33//Looks like an authentic client! Create a principal.34varclaims newListClaim35{36newClaim(ClaimTypes.Name, header.UserName),37newClaim(ClaimTypes.AuthenticationMethod, AuthenticationMethods.Password)38};3940varprincipal newClaimsPrincipal(new[] {newClaimsIdentity(claims,Digest) });4142Thread.CurrentPrincipal principal;4344if(HttpContext.Current !null)45HttpContext.Current.User principal;46}47}48}4950varresponse awaitbase.SendAsync(request, cancellationToken);5152if(response.StatusCode HttpStatusCode.Unauthorized)53{54response.Headers.WwwAuthenticate.Add(newAuthenticationHeaderValue(Digest,55Header.UnauthorizedResponseHeader.ToString()));56}5758returnresponse;59}60catch(Exception)61{62varresponse request.CreateResponse(HttpStatusCode.Unauthorized);63response.Headers.WwwAuthenticate.Add(newAuthenticationHeaderValue(Digest,64Header.UnauthorizedResponseHeader.ToString()));6566returnresponse;67}68}69}7071}摘要验证实现的核心方法实现完成后使用摘要验证只需要在对应的方法加上[Authorize]属性标签即可。摘要验证的优缺点摘要验证很好地解决了使用基本验证所担心的安全性问题。但是永远没有绝对的安全当用户使用字典进行穷举破解时还是会存在一些被破解的隐患。源码下载编辑器里怎么找不到上传文件的地方了我上传到了百度网盘里。源代码下载

相关新闻

RAG 召回率 95% 却答非所问?优先级冲突消解实测:3 种策略与 1 个弃用方案

RAG 召回率 95% 却答非所问?优先级冲突消解实测:3 种策略与 1 个弃用方案

2026/8/3 19:07:43

RAG系统文档冲突问题深度解析与解决方案 问题背景与影响分析 昨晚排查生产环境RAG系统时,发现一个值得警惕的现象:用户查询"2026年Taotoken API流量包计费规则"时,系统虽然召回了4份高度相关的文档(召回率高达95%&…

调参3个月才发现:过拟合修复只加L2正则化是错的,偏差-方差诊断才是关键

调参3个月才发现:过拟合修复只加L2正则化是错的,偏差-方差诊断才是关键

2026/8/3 19:07:43

从92%训练准确率到25%测试集的思考:一个机器学习菜鸟的觉醒之路 第一次在真实数据集上跑出92%的训练准确率时,那种兴奋感至今难忘。但当我看到测试集仅25%的惨淡结果时,整个人都懵了——这不是教科书里标准的过拟合案例吗?作为一…

Unity透明视频播放全攻略:AVPro Video插件在URP下的实战解析

Unity透明视频播放全攻略:AVPro Video插件在URP下的实战解析

2026/8/3 19:07:43

1. 项目概述:为什么Unity中的透明视频播放是个“技术活”? 在Unity项目里,尤其是做UI特效、AR/VR交互或者一些需要将动态视频与3D场景无缝融合的场合,直接播放一个带透明通道的视频(比如一个动态的烟雾、火焰、Logo光效…

Visual Studio 2022配置SDL2开发环境:从零到图形程序实战

Visual Studio 2022配置SDL2开发环境:从零到图形程序实战

2026/8/3 19:57:45

1. 项目概述 如果你是一个刚接触C图形或游戏编程的开发者,想在Visual Studio 2022这个强大的IDE里用SDL库做点东西,那么第一步——环境配置——很可能就是你遇到的第一个“拦路虎”。我见过太多新手卡在这一步,对着编译错误和链接器警告一筹莫…

从零开始手写STL库:Map

从零开始手写STL库:Map

2026/8/3 19:57:45

从零开始手写STL库–Map的实现 Github链接:miniSTL 文章目录从零开始手写STL库–Map的实现一、Map是什么二、Set要包含什么函数总结一、Map是什么 std::map是基于红黑树构建的数组结构,能够储存键和值这样的数据对,并且不允许重复元素的存在…

5分钟构建智能蓝牙HID设备:ESP32与NimBLE的完美融合

5分钟构建智能蓝牙HID设备:ESP32与NimBLE的完美融合

2026/8/3 19:57:45

5分钟构建智能蓝牙HID设备:ESP32与NimBLE的完美融合 【免费下载链接】esp-idf Espressif IoT Development Framework. Official development framework for Espressif SoCs. 项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf 想要让ESP32变身为智能…

自托管WebUI框架的5个架构设计原则与实现指南

自托管WebUI框架的5个架构设计原则与实现指南

2026/8/3 19:57:45

自托管WebUI框架的5个架构设计原则与实现指南 【免费下载链接】open-webui User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 项目地址: https://gitcode.com/GitHub_Trending/op/open-webui 在AI应用快速发展的今天,自托管WebUI框架已成为连…

MicroG在HarmonyOS上的完整实战指南:签名伪造与权限配置深度解析

MicroG在HarmonyOS上的完整实战指南:签名伪造与权限配置深度解析

2026/8/3 19:57:45

MicroG在HarmonyOS上的完整实战指南:签名伪造与权限配置深度解析 【免费下载链接】GmsCore Free implementation of Play Services 项目地址: https://gitcode.com/GitHub_Trending/gm/GmsCore MicroG作为Google移动服务的开源替代实现,为缺乏原生…

Vue拖拽排序实战:vue.draggable核心原理与复杂场景应用

Vue拖拽排序实战:vue.draggable核心原理与复杂场景应用

2026/8/3 19:47:45

1. 从“能拖”到“会拖”:为什么我们需要一个专业的拖拽库 在Vue项目里实现一个列表项的拖拽排序,听起来是个挺简单的需求,对吧?很多人的第一反应可能是:这还不简单,用HTML5原生的Drag and Drop API&#x…

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

2026/8/3 4:49:52

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲&am…

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

2026/8/3 19:24:18

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比工程导读:本文深入讨论 分布式配置中心选型实战:Nacos与Consul在创业场景下的对比 在生产工程实践中的核心落地方案。基于 分布式架构与微服务设计 视角,剖析实际痛点、架…

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

2026/8/2 0:04:43

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,…

从提示词小白到AI内容架构师(20年技术老兵的6阶能力跃迁图谱,仅剩最后87个免费解读名额)

从提示词小白到AI内容架构师(20年技术老兵的6阶能力跃迁图谱,仅剩最后87个免费解读名额)

2026/8/3 0:06:20

更多请点击: https://codechina.net 第一章:AI写作能力跃迁的认知革命 过去五年,AI写作已从“模板填充”迈入“语义共建”阶段——模型不再仅复述训练数据中的句式,而是基于跨文档推理、意图锚定与风格自适应,动态构建…

AU-48八米拾音的信噪比衰减与降噪门限耦合分析

AU-48八米拾音的信噪比衰减与降噪门限耦合分析

2026/8/3 0:06:20

一、"拾音 8 米"这个指标该怎么读AU-48 的规格里,麦克风拾取范围写的是 10cm-800cm,配合 T1/T2 参数切换可选四档:中距离 0.5-2m、近距离 0.1-0.2m、远距离 0.5-5m、超远距离 0.5-8m。"能拾音 8 米"这句话本身没错&#…

LangChain 从 Demo 到团队落地,真正卡壳的是哪一步?

LangChain 从 Demo 到团队落地,真正卡壳的是哪一步?

2026/8/3 0:06:20

聊《LangChain并不难,难的是知道什么时候不该用》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。 摘要 摘要:很多人学 LangChain 都是从调个 API 开始,跑通一个 Demo 觉得挺简单…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/2 17:06:42

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/3 7:25:44

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/3 2:41:27

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…