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 个弃用方案

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

2026/10/17 18:39:07 阅读更多 →
调参3个月才发现:过拟合修复只加L2正则化是错的,偏差-方差诊断才是关键

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

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

2026/10/13 18:38:46 阅读更多 →
Unity透明视频播放全攻略:AVPro Video插件在URP下的实战解析

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

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

2026/10/17 16:19:36 阅读更多 →

最新新闻

《人工智能基础》【工具篇17】:OpenClaw十大必装技能推荐与TaoToken统一接入实践

《人工智能基础》【工具篇17】:OpenClaw十大必装技能推荐与TaoToken统一接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 23:49:46 阅读更多 →
高级功能探索:深入理解LiteLLM的扩展能力与TaoToken统一Key接入

高级功能探索:深入理解LiteLLM的扩展能力与TaoToken统一Key接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 23:49:46 阅读更多 →
2026年第23周GitHub热门开源项目盘点:TaoToken视角下的AI工具接入实践

2026年第23周GitHub热门开源项目盘点:TaoToken视角下的AI工具接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 23:49:46 阅读更多 →
Java对接Box云存储:OAuth认证与分片上传下载实战指南

Java对接Box云存储:OAuth认证与分片上传下载实战指南

说来也挺巧,最近手上的一个小项目需要把本地文件往 Box 云存储上搬,还要能从 Box 拉回来。用 Java 捣鼓了几天,从 OAuth 授权到上传下载全流程都跑通了。Box 这类服务本身 API 做得很完整,但对第一次接触的人来说,坑其…

2026/10/17 23:49:46 阅读更多 →
CTP框架开发培训:从XML配置到OpContext树,拆解核心交易平台

CTP框架开发培训:从XML配置到OpContext树,拆解核心交易平台

简介:一份工行内部版《CTP框架开发培训》PPT,面向金融行业Java开发及渠道整合技术人员,系统讲解CTP(Core Transaction Platform)核心交易平台的总体构成、层次结构与交易处理流程。包体为单个pptx文件,共34…

2026/10/17 23:49:46 阅读更多 →
超表面透镜逆向设计:MATLAB中的伴随梯度与相位优化实现

超表面透镜逆向设计:MATLAB中的伴随梯度与相位优化实现

简介:《光学工程:MATLAB开发超表面透镜逆向设计优化算法》是一份面向光学工程与计算成像领域的高阶技术笔记,主要服务于需要掌握超表面器件设计与优化算法的科研人员、工程师及研究生。文档从光学工程与超表面透镜的基本概念入手,…

2026/10/17 23:48:45 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →