WebAPI 身份认证解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(一)
21 WebAPI服务
ASP.NET Web API,是微软在.NET Framework 4.5上推出的轻量级网络服务框架,虽然作为ASP.NET MVC 4的一部分,但却是一套全新的、独立的服务平台开发框架,可支持多种(包括移动)客户端的访问,非常适合于网络平台应用的开发。
Phenixヾ在ASP.NET Web API服务框架、及其自身业务框架(封装CSLA)基础上,为跨平台应用系统的实现提供了全面的数据服务,并为服务访问提供了身份认证、权限验证等辅助功能。
21.1 启动服务
Phenixヾ的WebAPI服务需运行在.NET Framework 4.6环境,框架文件存放在“\bin.NET4.6”目录,如需使用,请在该目录下启动服务程序Phenix.Services.Host.x86/x64.EXE。
启动后可见到如下提示,即说明服务已就绪:
21.2 配置服务
WebAPI服务提供了如下配置参数:
l Web API HTTP Port:默认值是8080。
l 可以在任何给定时间处理的并发HttpRequestMessage实例数的上限(实际将被乘以CPU内核数):默认值是100。
l HTTP请求标头附加身份认证的name值:默认值是“Phenix-Authorization”。
l HTTP请求标头附加突破客户端HTTP代理限制(某些HTTP代理不支持任意的HTTP方法(比如“PUT”、“DELETE”)的替代方法name值:默认值是“X-HTTP-Method-Override”。
l HTTP跨域访问开关:允许访问的资源(逗号分隔)列表,使用“*”表示全部允许: 默认值是“*”。
见:
其余参数未提供配置界面,请直接到config文件里做配置:
一般情况下采取默认配置即可,否则客户端亦要做相应的调整。Phenixヾ提供的Phenix.Web.Client工程即使用了默认配置。
21.3 身份认证
将应用系统放到Internet上,首先考虑的是安全问题。在评估了现有主流的各种解决方案之后,为兼顾跨平台的环境要求、便于应用系统的开发,Phenixヾ在应用层面上所设计的的安全方案,主要考虑到了如下安全性问题:
l 口令的保密性。
l 避免假冒攻击。
l 避免重放攻击。
l SQL注入攻击。
为保证用户的口令不被泄露,最基本的要求是不能在客户端与服务端之间的数据交换中以明文的形式传递。而只要口令由用户和系统各自保存一份,我们就可以将口令当作对称加密报文方法的密钥来使用。比如,对传递的Header、Data等信息进行适当的加密,就可以用来验证数据是否是来自被授权的发送方。
21.3.1口令的保密性处理
用户在注册时,初始口令不管是谁生成的,都需要传递给对方,以保持口令的一致(拥有相同的密钥)。
Phenixヾ推荐应用系统利用用户的邮箱或者用户的手机等第三方通讯手段来传递初始口令。一般是系统自动生成一个初始口令发给用户,由用户利用初始口令登录系统:
在这个流程里,Phenixヾ为应用系统授权模块开发提供了新增用户的接口函数供调用:
Phenix.Core.Data.DefaultDatabase.ExecuteOle(Phenix.Core.Security.DataSecurityHub.AddUser, 邮箱地址, 用户名, 初始口令)
因为这个函数是直接操作数据库的,所以调用方代码需写在服务端上。
同样,如果用户忘记了登录口令,也可以如法炮制,用用户名和邮箱地址来重置口令:
Phenixヾ也为此流程提供了更新登录口令的接口函数供调用:
Phenix.Core.Data.DefaultDatabase.ExecuteOle(Phenix.Core.Security.DataSecurityHub.ChangePassword, 用户名, 初始口令)
同理,这段调用代码也要运行在服务端上。
以上方案中的授权模块实现,需应用系统自行设计和开发,以匹配自己的应用场景。
21.3.2防范假冒重发攻击
为了防范假冒重发攻击,Phenixヾ要求客户端在报文的Header中附带nonce、timestamp、signature。其中nonce是一个随机数、timestamp是时间戳、signature是对nonce + timestamp做了AES加密后的字符串,AES加密用的Key和IV就是用户的登录口令(经MD5散列算法处理)。
设计方法讲解起来有点复杂,还不如直接看代码更便于理解。以下是AJAX在每次发送报文时,自动向报文头添加身份认证(“Phenix-Authorization”)Header的代码,摘录自“Phenix.Test.使用指南.21.3.html”:
$user =
{
userNumber: "",
password: ""
};
$.ajaxSetup({
beforeSend: function(XMLHttpRequest) {
jQuery.support.cors = true;
var nonce = Math.round(Math.random() * 999999999999999);
var timestamp = new Date().toISOString();
var key = CryptoJS.MD5($user.password);
XMLHttpRequest.setRequestHeader("Phenix-Authorization",
$user.userNumber + "," + nonce + "," + timestamp + "," +
CryptoJS.AES.encrypt(nonce + timestamp, key, { iv: key, mode: CryptoJS.mode.CBC }));
}
});
注意:实际场景下,请将用户名、口令缓存在本地,口令绝不能上传到服务端。对于浏览器应用,页面之间跳转时传递的敏感数据,也不能通过服务端。
对应的Phenix.Web.Client.DLL工程,在其Phenix.Web.Client.Security.AuthenticationHandler类中也有类似的代码:
//身份认证格式: [UserNumber],[nonce],[timestamp],[signature = Encrypt(Password, nonce+timestamp)]
string nonce = Guid.NewGuid().ToString(); //也允许采用其他随机数形式, 只要在一个LogOn到LogOff周期内不发生重复即可
DateTime timestamp = DateTime.Now;
request.Headers.Add(Phenix.Web.Client.Properties.Settings.Default.WebAuthHeaderName,
String.Format("{0},{1},{2},{3}", _userNumber, nonce, timestamp, RijndaelCryptoTextProvider.Encrypt(_password, nonce + timestamp)));
可用“Phenix.Test.使用指南.21.3”工程调试下看看效果:
其他操作环境和开发语言,只要遵循上述设计方法编写,都可以与Phenixヾ的WebAPI服务交互。(后续会陆续补上其他语言的测试案例)
21.3.3基本操作功能
Phenixヾ的身份认证服务,提供了如下的基本操作功能:
功能 |
Type |
URI |
参数 |
登录 |
POST |
api/DataSecurity |
userNumber=[用户名] |
修改登录口令 |
PUT |
api/DataSecurity |
userNumber=[用户名]&encryptedNewPassword=[经加密的新口令] |
登出 |
DELETE |
api/DataSecurity |
userNumber=[用户名] |
以下代码摘录自“Phenix.Test.使用指南.21.3.html”,在Internet Explorer 11 Web浏览器上通过测试。
21.3.3.1 登录
function LogOn(userNumber, password) {
$user.userNumber = userNumber;
$user.password = password;
$.ajax({
type: "POST",
url: "http://localhost:8080/api/DataSecurity?userNumber=" + userNumber,
dataType: "JSON",
contentType: "application/json;charset=utf-8",
data: {},
complete: function(XMLHttpRequest, textStatus) {
if (XMLHttpRequest.status === 200)
alert("登录成功! status: " + XMLHttpRequest.statusText + ", response: " + XMLHttpRequest.responseText);
else if (XMLHttpRequest.status === 401)
alert("登录无效! status: " + XMLHttpRequest.statusText + ", response: " + XMLHttpRequest.responseText);
else
alert("登录失败! status: " + XMLHttpRequest.statusText + ", response: " + XMLHttpRequest.responseText);
}
});
}
21.3.3.2 修改登录口令
function ChangePassword(userNumber, password, newPassword) {
$user.userNumber = userNumber;
$user.password = password;
var key = CryptoJS.MD5(password);
$.ajax({
type: "PUT",
url: "http://localhost:8080/api/DataSecurity?userNumber=" + userNumber +
"&encryptedNewPassword=" + CryptoJS.AES.encrypt(newPassword, key, { iv: key, mode: CryptoJS.mode.CBC }),
dataType: "JSON",
contentType: "application/json;charset=utf-8",
data: {},
complete: function(XMLHttpRequest, textStatus) {
if (XMLHttpRequest.status === 200)
alert("修改登录口令成功! status: " + XMLHttpRequest.statusText + ", response: " + XMLHttpRequest.responseText);
else
alert("修改登录口令失败! status: " + XMLHttpRequest.statusText + ", response: " + XMLHttpRequest.responseText);
}
});
}
21.3.3.3 登出
function LogOff(userNumber) {
$.ajax({
type: "DELETE",
url: "http://localhost:8080/api/DataSecurity?userNumber=" + userNumber,
dataType: "JSON",
contentType: "application/json;charset=utf-8",
data: {},
complete: function (XMLHttpRequest, textStatus) {
if (XMLHttpRequest.status === 200)
alert("登出成功! status: " + XMLHttpRequest.statusText + ", response: " + XMLHttpRequest.responseText);
else
alert("登出失败! status: " + XMLHttpRequest.statusText + ", response: " + XMLHttpRequest.responseText);
}
});
}
21.3.3.4 试用效果
WebAPI 身份认证解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(一)的更多相关文章
- WebAPI 权限控制解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(三)
21.1 数据服务 21.1.1基本操作功能 Phenixヾ的数据服务,提供了如下的基本操作: 功能 Type URI 参数 完整获取实体集合对象 GET api/Data 分页获取实体集合对象 ...
- C#进阶系列——WebApi 身份认证解决方案:Basic基础认证
前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...
- #进阶系列——WebApi 身份认证解决方案:Basic基础认证
阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2.Basic基础认证原理 三.Basic基础认证的代码示例 1.登录过程 2./Home/Index主界面 3 ...
- SNF快速开发平台MVC-EasyUI3.9之-WebApi身份验证问题解决方案
在我们的整体bs框架当中前端采用的是MVC+WebApi的处理方式.WebApi使用起来确实很方便但也会有新的麻烦事,就是身份验证. 如果没有启用身份认证,那么任何匿名用户只要知道了我们服务的url, ...
- SNF快速开发平台MVC-EasyUI3.9之-WebApi和MVC-controller层接收的json字符串的取值方法和调用后台服务方法
最近项目组很多人问我,从前台页面传到后台controller控制层或者WebApi 时如何取值和运算操作. 今天就都大家一个在框架内一个取值技巧 前台JS调用代码: 1.下面是选中一行数据后右键点击时 ...
- SNF快速开发平台MVC-EasyUI3.9之-WebApi跨域处理方案
在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案.由于时间有限,本文不会深入. 笔者遇到的问题是Js调用WebAPI中的数据进行跨域的场景.涉及若干跨域方案:目前采用we ...
- JeeSite 企业信息化快速开发平台
平台简介 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台. JeeSite本身是以Spring Framework为核心容器,Spri ...
- Basic4android:多功能的Android应用软件快速开发平台
Basic4android 是目前最简单.最强大的Android平台快速应用开发工具. ( "Basic4android is the simplest and most powerful ...
- WebApi身份认证解决方案:Basic基础认证
前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...
随机推荐
- 复数基础及其2D空间的旋转
本文我们讨论复数及其旋转的含义.复数很有意思,本文介绍了复数的基本定义和性质,以及它关于旋转的几何意义. 复数对于旋转的两个方面极为重要: 1. 它引入了旋转算子(rotational operato ...
- 主进程和服务进程通信调用Acrobat.AcroPDDoc时出现的问题
场景以及问题 主进程发送命令,服务进程接受到,然后执行转换pdf,调用Acrobat pdfDoc = (Acrobat.CAcroPDDoc)Microsoft.VisualBasic.Intera ...
- Jmter(一)_时间戳
显示当前时间的使用Jmeter-Tools-Function Helper Dialog的__time 显示当前时间移动的使用__timeShift 有日期移动(e.g. P2D);时(PT2H);分 ...
- celery异步任务、定时任务
阅读目录 一 什么是Celery? 二 Celery的使用场景 三 Celery的安装配置 四 Celery异步任务 五Celery定时任务 六在Django中使用Celery 一 什么是Cele ...
- Python面向对象 | 抽象类和接口类
一.抽象类(规范的编程模式) 什么是抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化.抽象类的本质还是类,指的是一组类的相似性,而接口只强调函数属性的相似性. 为什么要有抽象类 ...
- T1 :最小值(min)题解 ——2019.10.15
思路: 对于 % 30 的数据,可以想到一个 Dp 方程: 其中dp[i]表示分割[1,i]的最大答案 代码: #include<cstdio> #include<cstring&g ...
- ES6-Generator使用与改写
用Generator封装Symbol中的iterator方法: 注意:Generator的function后必须写* config:分别有3个txt文件,两个文件写路径,一个文件写要输出的内容 前置写 ...
- 微软SQL Server 2019 全新发布,更新内容亮点都在这里了
IT之家11月7日消息 在Microsoft Ignite 2019 大会上,微软正式发布了新一代数据库产品SQL Server 2019.使用统一的数据平台实现业务转型SQL Server 20 ...
- Android Q Beta 6 终极测试版发布!
前言 当今手机市场可谓是百花齐放,但手机系统却屈指可数,其中Android和iOS就占据了整个手机系统市场的99%,单单Android就占据了整个手机系统市场的86%,可谓是占据绝对优势. 其 ...
- java面试题——高级篇
一.集合 Hashmap的原理 源码分析参考文章:http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532832.html 题目参考文章:htt ...