本系列博客链接:webapi框架搭建系列博客

前言

  webapi接口是开放给外部使用的,包括接口的地址,传参的规范,还有返回结果的说明。正因为接口的开放性,使得接口的安全很重要。试想一下,用抓包工具(如fiddler),甚至浏览器获取到接口的规范后(甚至可以猜到接口的其它规范),如果接口没有做”安全“这一道防火墙,任何人都可以调用接口来获取及提交数据,这真是太可怕了。17年我负责一个气象类项目的开发,其中有些功能是我们无法完成但甲方要求必须有的功能,并给我们展示了实现该功能的一个产品。后面通过对此产品的fiddler抓包分析,了解了该产品是通过接口向apps端提供数据,而所有的接口竟然都没有加密,于是这个项目基于此功能的实现基本上都是通过调用该产品的接口实现,对我来说是省去了很大的开发成本,但对于那个产品的公司来说是损失了有价值的数据。

  对于webapi方面的安全,可写的东西太多了,且asp.net webapi及asp.net core webapi在安全方面也有些差异。我只对”webapi框架搭建“项目里用到的技术做一些说明。后续的博客会对每一个技术的实现做详细的描述。

JWT技术

  考虑http的无状态性,且又必须让服务器能区分每次的http请求是”谁“发出的,但又不想在http请求里携带很多信息(尽量每次的请求包比较小),我采用token技术。即将用户的基本信息,如用户id,用户的角色等进行加密,并附在http请求头里。服务器端只要对token进行解密后就能知道是谁发起的请求。之前我是自己生成token,规范token的加密/解密规则和token里存储的信息(如一个user实体的信息),后面发现这一技术已经有一个规则,那就是jwt。jwt参考如下网站:https://jwt.io/。

webapi安全

  微软对webapi的安全拆分为authentication和authorization,authentication的职责是解决”用户是谁“的问题,而authorization的职责是解决”是否有权限“的问题。通过jwt技术,可以解决”用户是谁“的问题,通过”基于角色的权限控制“可以解决”是否有权限“的问题。后续的博客会详细说明。

安全的”切入点“

  我们肯定不想在每个接口里都去写一段”安全代码“,而是用aop的思想,在整个http请求的生命周期中做为一个切面插入到生命周期的某个点上。所以先让我们了解下webapi的生命周期。如下图。

对于在哪一个环节做为安全机制的切入点,微软的一篇文章里说的很好:https://msdn.microsoft.com/en-us/magazine/dn781361.aspx。我总结如下

Http Module:如果webapi的host为iis,所有的请求会通过httpmodule,可以创建自己的httpmodule并在该类里写安全机制的代码。缺点是和iis耦合了。而我们现在的教程里用的是owin技术。所以先排除。

owin middleware:如果webapi的host为owin,可创建自己的安全middleware组件,并注册到owin管道里。只要webapi组件注册在该组件之后就行。且这种方式有一个优点(也能说是它的缺点),不仅可以用于webapi框架,也可以用于其它框架的安全,只要该框架可以注册在owin管道里就行。

http Message handler:从上图可以看出,请求从httpserver出来后的第一个通道就是http message handler。微软的这篇文章里也提到怎么用这种方式去实现:https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api。

action filter:可以但不建议的方式,良好的安全通道是http请求先经过authentication再经过authorization(即要先知道这个人“是谁”才能知道他有什么“权限”)。但从图可以看出action filter是在authorization filter之后,虽然可以不用authorization filter,只用action filter,但毕竟有点怪异。

authentication filter和authorization filter:推荐的方式。

webapi框架搭建-安全机制(一)的更多相关文章

  1. webapi框架搭建-安全机制(四)-可配置的基于角色的权限控制

    webapi框架搭建系列博客 在上一篇的webapi框架搭建-安全机制(三)-简单的基于角色的权限控制,某个角色拥有哪些接口的权限是用硬编码的方式写在接口上的,如RBAuthorize(Roles = ...

  2. webapi框架搭建-安全机制(三)-简单的基于角色的权限控制

    webapi框架搭建系列博客 上一篇已经完成了“身份验证”,如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行. Authorize特性的使 ...

  3. webapi框架搭建-安全机制(二)-身份验证

    webapi框架搭建系列博客 身份验证(authentication)的责任是识别出http请求者的身份,除此之外尽量不要管其它的事.webapi的authentication我用authentica ...

  4. webapi框架搭建系列博客

    webapi框架搭建系列博客 webapi框架搭建-创建项目(一) webapi框架搭建-创建项目(二)-以iis为部署环境的配置 webapi框架搭建-创建项目(三)-webapi owin web ...

  5. webapi框架搭建-创建项目(三)-webapi owin

    上一篇:创建项目(二) 在上一篇里,我们已经创建好了webapi应用,并已经部署到iis里,本篇讲如何用owin自宿主或是iis宿主来部署webapi应用. owin介绍 传统的asp.net网站只能 ...

  6. webapi框架搭建-日志管理log4net

    前言 本篇讲怎么在前几篇已经创建好的项目里加上日志处理机制,我们采用Log4net技术.跟多的log4net技术的细节请查阅log4net的官网. log4net官网:http://logging.a ...

  7. webapi框架搭建-webapi异常处理

    webapi框架搭建系列博客 前言 上一篇我们已经完成了项目的日志管理,在项目开发中日志会经常记录程序中的异常,供后续问题排查使用.本篇讲如何在webapi里加入异常处理机制. 目的和原则 1.程序任 ...

  8. webapi框架搭建-数据访问ef code first

    webapi框架搭建系列博客 为什么用ef? 我相信很多博友和我一样都有这种“选择困难症”,我曾经有,现在也有,这是技术人的一个通病——总想用“更完美”的方式去实现,导致在技术选择上犹豫不决,或总是推 ...

  9. webapi框架搭建-依赖注入之autofac

    前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...

随机推荐

  1. css3学习笔记一

    首先界面是二维的但也可以有三维的效果.先了解浏览器兼容性问题,火狐加前缀(-moz-)IE加(-MF-)谷歌加(-webkit),简单介绍css3的几个属性. 对于背景来说如果是单纯着一种颜色可以会单 ...

  2. In-band Network Function Telemetry

    文章名称:In-band Network Function Telemetry 发表时间:2018 期刊来源:SIGCOMM I Introduction (介绍) NFV运行在商品服务器上,在网络功 ...

  3. eg_6

    问题描述: 将一句话的单词进行倒置,标点不倒置.比如 I like beijing. 经过函数后变为:beijing. like I Demo1: import java.util.Scanner; ...

  4. maven导入项目时出现“Cannot read lifecycle mapping metadata …… invalid END header (bad central directory offset)pom”错误的解决方法

    出现该错误是因为jar包版本不匹配,比如linux上的jar包导入到windows上了.可以将.m2\repository的org.apache.maven.plugins删掉然后让maven重新下载 ...

  5. JTS

    在这个系列的 第 1 部分,我们讨论了事务并研究了它们的基本属性 ― 原子性(atomicity).一致性(consistency).孤立性(isolation)和持久性(durability).事务 ...

  6. excel文件怎么使用php进行处理

    1.可以通过phpmyadmin导入csv文件 2.也可以直接使用php 处理已经将excel另存为.csv后缀的文件, 通过php专门处理csv文件的函数 如 fgetcsv() <?php ...

  7. [微软官网] SQLSERVER 执行页面还原

    执行页面还原 https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ms175168(v=sql.105) ...

  8. Java 使用 Dbutils 工具类库 操作mysql

    Dbutils 官网http://commons.apache.org/proper/commons-dbutils/ 结合我个人写的JDBCUtils 写的 Dbutils 的使用demo . JD ...

  9. Laravel 5.1 中的异常处理器和HTTP异常处理 abort()

    原文  http://laravelacademy.org/post/1867.html 错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便 ...

  10. Dubbo学习(四) dubbo的特点,8种通信协议之对比

    一.dubbo的特性 (1) 连通性: 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小 监控中心负责统计各服务调用次数,调用 ...