优点是逻辑简单明了、设置简单。

缺点显而易见,即使是BASE64后也是可见的明文,很容易被破解、非法利用,使用HTTPS是一个解决方案。

还有就是HTTP是无状态的,同一客户端每次都需要验证。

实现:

客户端在用户输入用户名及密码后,将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中,如当用户名为Parry,密码为123456时,客户端将用户名和密码用":"合并,并将合并后的字符串用BASE64加密,并于每次请求数据时,将密文附加于请求头(Request Header)中。

HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

自定义属性HTTPBasicAuthorize ,继承AuthorizeAttribute,并实现两个方法:OnAuthorization和HandleUnauthorizedRequest。

   public class HTTPBasicAuthorizeAttribute : System.Web.Http.AuthorizeAttribute{public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext){if (actionContext.Request.Headers.Authorization != null){//对客户端进行BASE64后的字符串再解码string userInfo = Encoding.Default.GetString(Convert.FromBase64String(actionContext.Request.Headers.Authorization.Parameter));//用户验证逻辑if (string.Equals(userInfo, string.Format("{0}:{1}", "Parry", "123456"))){IsAuthorized(actionContext);}else{HandleUnauthorizedRequest(actionContext);}}else{HandleUnauthorizedRequest(actionContext);}}
//或不重写OnAuthorization,对IsAuthorized方法重写protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext){if (actionContext.Request.Method == HttpMethod.Options)return true;if (actionContext.Request.Headers.Authorization != null && actionContext.Request.Headers.Authorization.Parameter != null) { // System.Web.Security.FormsAuthentication.var userdata= System.Text.Encoding.Default.GetString(Convert.FromBase64String(actionContext.Request.Headers.Authorization.Parameter));if (userdata.Equals(String.Format("{0}:{1}", "tzy", "123"))) {return true;//base.IsAuthorized(actionContext);
               }}return false;// return base.IsAuthorized(actionContext);
        }protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext){var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);challengeMessage.Headers.Add("WWW-Authenticate", "Basic");throw new System.Web.Http.HttpResponseException(challengeMessage);}}

这些代码值得注意的地方及说明

1.  if (actionContext.Request.Method == HttpMethod.Options)   这个判断是在进行跨域访问时浏览器会发起一个Options请求去试探这个请求,但是他不会带着data参数和一些header参数,所以认证肯定没法通过导致无法继续进行,所以给他直接认证通过。(对非跨域的则没有影响)

2.对Authorization.Parameter 的解密,这里的解析跟登陆成功之后返回的Token 加密方式相同就行 这里采用的是Basic认证方式(简单的64位字符串)

3.HandleUnauthorizedRequest方法 这里因为是继承重写的AuthorizeAttribute,在IsAuthorized 返回False的时候会执行这个方法

这里是返回一个401的错误信息

4.challengeMessage.Headers.Add("WWW-Authenticate","Basic");   这句代码指示浏览器 认证方式为Basic 然后浏览器自动弹出一个登陆窗口并以basic 的方式 加密后每次通过header 传输到服务器进行认证然后得到授权

在需要验证的Controller的类加上[HTTPBasicAuthorize]属性,即可对当前控制器下的所有方法实现基本身份认证

然后我习惯更改一下api的路由  就改了一下routeTemplate 加入/{action}

public static void Register(HttpConfiguration config){// Web API configuration and services// Web API routes
            config.MapHttpAttributeRoutes();// config.Filters.Add(new AuthorizeAttribute());
            config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional });}

如果以webapi里面有xml 方式返回,更改formatter 如下

protected void Application_Start(){GlobalConfiguration.Configure(WebApiConfig.Register);GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();}

ASP.NET Web API 实现客户端Basic(基本)认证 之简单实现相关推荐

  1. ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API(二)

    在前一篇博文中,我们使用OAuth的Client Credential Grant授权方式,在服务端通过CNBlogsAuthorizationServerProvider(Authorization ...

  2. ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API

    在前一篇博文中,我们使用OAuth的Client Credential Grant授权方式,在服务端通过CNBlogsAuthorizationServerProvider(Authorization ...

  3. 生成用于ASP.NET Web API的C#客户端API

    目录 介绍 主要特征 主要好处 背景 推定(Presumptions) 使用代码 步骤0:将NuGet软件包WebApiClientGen安装到Web MVC/API项目 步骤1:建立.NET Cli ...

  4. 生成用于ASP.NET Web API的TypeScript客户端API

    目录 介绍 备注 背景 推定(Presumptions) 使用代码 步骤0:将NuGet package WebApiClientGen和WebApiClientGen.jQuery安装到Web AP ...

  5. android 调用 asp.net web api,从 .NET 客户端调用 Web API (C#)

    从 .NET 客户端调用 Web API (C#) 11/24/2017 本文内容 此内容适用于以前版本的 .NET. 新开发应该使用 ASP.NET Core. 有关使用 Core Web API ...

  6. 【ASP.NET Web API教程】2.3.3 创建Admin控制器

    原文:[ASP.NET Web API教程]2.3.3 创建Admin控制器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. Part 3 ...

  7. 【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

    基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份验证已 ...

  8. 【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据

    注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. 5.2 Sending HTML Form Data 5.2 发送HTML表单数据 本文引 ...

  9. 《ASP.NET Web API 2框架揭秘》

    <ASP.NET Web API 2框架揭秘> 基本信息 作者: 蒋金楠 出版社:电子工业出版社 ISBN:9787121235368 上架时间:2014-7-5 出版日期:2014 年7 ...

最新文章

  1. 两难!到底用Apache BeanUtils还是Spring BeanUtils?
  2. 二进制搭建kubernetes多master集群【三、配置k8s master及高可用】
  3. UVA - 10118 Free Candies 记忆化搜索经典
  4. python logging模块简单使用
  5. LeetCode 4. 寻找两个有序数组的中位数(二分查找,难)
  6. 配置tomcat 7控制台账号
  7. HDFS的JAVA客户端编写
  8. EasyX画动态时钟
  9. 【嵌入式模块】直流电机驱动L298N,TB6612详解
  10. C51单片机实验——中断实验
  11. 观 小楼老师Axure /得
  12. 怎样查找计算机死机日志,怎么查看电脑死机记录
  13. 什么是云平台_云短信发送平台有什么优势?
  14. 激光雷达错位拼接技术
  15. 使用记账软件记录生活收支明细,如何防止收支不被他人修改
  16. KEIL4 的操作技巧
  17. luogu P4735 最大异或和
  18. FPGA中的时钟设计1
  19. 中国最大的系统软件开发外包公司排行榜有哪些
  20. fseek、ftell文件操作函数

热门文章

  1. 阿里二面:如何设计与实现短URL服务?
  2. 聊聊 SpringCloud 中的父子容器
  3. Datawhale浙大分享(附投票结果)
  4. TensorFlow2.0 系列开篇: Windows下GPU版本详细安装教程
  5. 博士申请 | 日内瓦大学招收机器学习和计算机视觉博士生(年薪35万)
  6. 最新!TUI世界大学排名(2021)发布:清华位居全球前20名!
  7. IBM中国研究院被曝已全面关闭
  8. 你还在用GDB调试程序吗?
  9. 干货 | 你的Paper阅读能力合格了吗(硕士生版)
  10. 假如曹操是一名程序员,会发生什么?