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请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...
随机推荐
- angular6 使用tooltip
准备 为了使用tooltip,可以安装ng-bootstrap组件,它包含两个依赖: angular:5.0以上版本: bootstrap css: 4.0版本. 安装好bootstrap之后,更新a ...
- USACO Protecting the Flowers
洛谷 P2878 [USACO07JAN]保护花朵Protecting the Flowers 洛谷传送门 JDOJ 1009: 护花 JDOJ传送门 Description FJ出去砍木材去了,把N ...
- VS Code配置Python
安装 1.安装python插件 直接在VS Code里搜索“Python”插件,安装. 2.下载Python 去官网下载Python 其他的插件在第一次运行Python程序会提示,按要求安装即可. 运 ...
- zzulioj - 2618: ACM-ICPC亚洲区域赛ZZULI站
题目链接; http://acm.zzuli.edu.cn/problem.php?id=2618 题目描述 玩了这么多游戏,V决定还是去做几道ACM题练练手,于是翻到了一道201X年ACM/ICPC ...
- Python面向对象 | 类属性
property property是一个装饰器函数,可以将一个方法伪装成属性,调用的时候可以不用加().@property被装饰的方法,是不能传参数的,因为它伪装成属性了. 装饰器的使用:在要装饰的函 ...
- 拷贝插件 copy-webpack-plugin
用于拷贝文件或目录到输出目录中 https://blog.csdn.net/weixin_41643133/article/details/95489335 https://www.jianshu.c ...
- 从rpm包提取rpm spec 的几种方法
包含了源码包 先安装,然后在rpmbuild 目录直接可以查看文件 不用安装 ,使用rpm2cpio rpm2cpio myrpm.src.rpm | cpio -civ '*.spec' 没有源码 ...
- django ORM创建
简短的例子 from django.db import models class Person(models.Model): first_name = models.CharField(max_len ...
- 1. Spring Cloud Greenwich SR2 概览
Spring Cloud provides tools for developers to quickly build some of the common patterns in distribut ...
- K8s集群认证之RBAC
kubernetes认证,授权概括总结: RBAC简明总结摘要:API Server认证授权过程: subject(主体)----->认证----->授权[action(可做什么)]--- ...