[转]ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)
2016-06-12 11:33
561 查看
本文转自:http://www.cnblogs.com/parry/p/ASPNET_MVC_Web_API_digest_authentication.html
在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看另一种验证的方式:digest authentication,即摘要认证。
下图为摘要验证的验证原理流程图。
摘要验证实现的核心方法
实现完成后,使用摘要验证只需要在对应的方法加上[Authorize]属性标签即可。
但是永远没有绝对的安全,当用户使用字典进行穷举破解时,还是会存在一些被破解的隐患。
源代码下载
作者:Parry 出处:http://www.cnblogs.com/parry/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类: 00.ASP.NET
在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看另一种验证的方式:digest authentication,即摘要认证。
系列文章列表
ASP.NET Web API(一):使用初探,GET和POST数据 ASP.NET Web API(二):安全验证之使用HTTP基本认证 ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)摘要认证原理
在基本认证的方式中,主要的安全问题来自于用户信息的明文传输,而在摘要认证中,主要通过一些手段避免了此问题,大大增加了安全性。下图为摘要验证的验证原理流程图。
1 namespace DigestAuthentication 2 { 3 public class AuthenticationHandler : DelegatingHandler 4 { 5 protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 6 { 7 try 8 { 9 var headers = request.Headers; 10 if (headers.Authorization != null) 11 { 12 Header header = new Header(request.Headers.Authorization.Parameter, 13 request.Method.Method); 14 15 if (Nonce.IsValid(header.Nonce, header.NounceCounter)) 16 { 17 // Just assuming password is same as username for the purpose of illustration 18 string password = header.UserName; 19 20 string ha1 = String.Format("{0}:{1}:{2}", header.UserName, header.Realm, 21 password).ToMD5Hash(); 22 23 string ha2 = String.Format("{0}:{1}", header.Method, header.Uri).ToMD5Hash(); 24 25 string computedResponse = String 26 .Format("{0}:{1}:{2}:{3}:{4}:{5}", 27 ha1, header.Nonce, header.NounceCounter, 28 header.Cnonce, "auth", ha2).ToMD5Hash(); 29 30 if (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. 34 var claims = new List<Claim> 35 { 36 new Claim(ClaimTypes.Name, header.UserName), 37 new Claim(ClaimTypes.AuthenticationMethod, AuthenticationMethods.Password) 38 }; 39 40 var principal = new ClaimsPrincipal(new[] { new ClaimsIdentity(claims, "Digest") }); 41 42 Thread.CurrentPrincipal = principal; 43 44 if (HttpContext.Current != null) 45 HttpContext.Current.User = principal; 46 } 47 } 48 } 49 50 var response = await base.SendAsync(request, cancellationToken); 51 52 if (response.StatusCode == HttpStatusCode.Unauthorized) 53 { 54 response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue("Digest", 55 Header.UnauthorizedResponseHeader.ToString())); 56 } 57 58 return response; 59 } 60 catch (Exception) 61 { 62 var response = request.CreateResponse(HttpStatusCode.Unauthorized); 63 response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue("Digest", 64 Header.UnauthorizedResponseHeader.ToString())); 65 66 return response; 67 } 68 } 69 } 70 71 }
摘要验证实现的核心方法
实现完成后,使用摘要验证只需要在对应的方法加上[Authorize]属性标签即可。
摘要验证的优缺点
摘要验证很好地解决了使用基本验证所担心的安全性问题。但是永远没有绝对的安全,当用户使用字典进行穷举破解时,还是会存在一些被破解的隐患。
源码下载
编辑器里怎么找不到上传文件的地方了?我上传到了百度网盘里。源代码下载
作者:Parry 出处:http://www.cnblogs.com/parry/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类: 00.ASP.NET
相关文章推荐
- How ASP.NET MVC Works?
- 仅此一文让你明白ASP.NET MVC 之Model的呈现
- 仅此一文让你明白ASP.NET MVC 之View的显示
- 仅此一文让你明白ASP.NET MVC原理
- 关于ASP.NET中OnClientClick事件Eval函数解析错误的处理
- Raspberry Pi3 ~ 使用eclipse进行远程调试
- asp.net实现固定GridView标题栏的方法(冻结列功能)
- AspNetCore.Hosting
- AOP(面向切面编程 Aspect Oriented Programming)
- ASP.NET Core 中文文档 第二章 指南(4.1)ASP.NET Core MVC 与 Visual Studio 入门
- asp.net如何定时执行任务
- ASP.Net简介
- asp.net学习总结——ADO.net(对Sql Server进行操作的数据访问类)
- Asp.net Session 与Cookie的应用
- asp.net学习总结——Asp.net对象之Session对象、Cookie对象
- ASP.NET Core 源码阅读笔记(3) ---Microsoft.AspNetCore.Hosting
- asp.net学习总结——Asp.net对象之Request对象、Response对象
- asp.net学习总结——对asp.net的理解
- ASP.NET MVC 网站开发总结(五)——Ajax异步提交表单之检查验证码
- ASP.NET 搭建贴吧机器人(零)