您的位置:首页 > 编程语言 > ASP

[转]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,即摘要认证。

系列文章列表

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: