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服务(一)的更多相关文章

  1. WebAPI 权限控制解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(三)

    21.1   数据服务 21.1.1基本操作功能 Phenixヾ的数据服务,提供了如下的基本操作: 功能 Type URI 参数 完整获取实体集合对象 GET api/Data 分页获取实体集合对象 ...

  2. C#进阶系列——WebApi 身份认证解决方案:Basic基础认证

    前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...

  3. #进阶系列——WebApi 身份认证解决方案:Basic基础认证

    阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2.Basic基础认证原理 三.Basic基础认证的代码示例 1.登录过程 2./Home/Index主界面 3 ...

  4. SNF快速开发平台MVC-EasyUI3.9之-WebApi身份验证问题解决方案

    在我们的整体bs框架当中前端采用的是MVC+WebApi的处理方式.WebApi使用起来确实很方便但也会有新的麻烦事,就是身份验证. 如果没有启用身份认证,那么任何匿名用户只要知道了我们服务的url, ...

  5. SNF快速开发平台MVC-EasyUI3.9之-WebApi和MVC-controller层接收的json字符串的取值方法和调用后台服务方法

    最近项目组很多人问我,从前台页面传到后台controller控制层或者WebApi 时如何取值和运算操作. 今天就都大家一个在框架内一个取值技巧 前台JS调用代码: 1.下面是选中一行数据后右键点击时 ...

  6. SNF快速开发平台MVC-EasyUI3.9之-WebApi跨域处理方案

    在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案.由于时间有限,本文不会深入. 笔者遇到的问题是Js调用WebAPI中的数据进行跨域的场景.涉及若干跨域方案:目前采用we ...

  7. JeeSite 企业信息化快速开发平台

    平台简介 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台. JeeSite本身是以Spring Framework为核心容器,Spri ...

  8. Basic4android:多功能的Android应用软件快速开发平台

    Basic4android 是目前最简单.最强大的Android平台快速应用开发工具. ( "Basic4android is the simplest and most powerful ...

  9. WebApi身份认证解决方案:Basic基础认证

    前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...

随机推荐

  1. NBU磁带库报错代码

    Linux驱动报错"Sense Key"和"ASC and ASCQ"含义 1.Sense Keys Definitions 0x0 No sense 0x1 ...

  2. XGBoost使用教程(进阶篇)三

    一.Importing all the libraries import pandas as pdimport numpy as npfrom matplotlib import pyplot as ...

  3. websocket 的基本用法

    项目当中使用到了websocket,以前的项目当中使用到了另外一个类似的socket.io,两者的区别和联系在另外一篇文章当中有提及,这里就简单的写下websocket的用法 下面的例子是阮一峰的We ...

  4. 模型选择---KFold,StratifiedKFold k折交叉切分

    StratifiedKFold用法类似Kfold,但是他是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同. 例子: import numpy as np from sklearn.m ...

  5. NLP中的预训练语言模型(一)—— ERNIE们和BERT-wwm

    随着bert在NLP各种任务上取得骄人的战绩,预训练模型在这不到一年的时间内得到了很大的发展,本系列的文章主要是简单回顾下在bert之后有哪些比较有名的预训练模型,这一期先介绍几个国内开源的预训练模型 ...

  6. Bootstrap基础学习 ---- 系列文章

    [Bootstrap基础学习]05 Bootstrap学习总结 [Bootstrap基础学习]04 Bootstrap的HTML和CSS编码规范 [Bootstrap基础学习]03 Bootstrap ...

  7. axios get及post方法代码示例&&方法封装

    axios get及post方法代码示例 get方法: show: function(){ //get方式 //赋值给变量self var self = this; var url = "h ...

  8. scrapy 改 scrapy-redis

    1.spider 修改 class CgysSpider(scrapy.Spider): name = 'clispider' start_urls = ['https://search.bilibi ...

  9. JDOJ 2157 Increasing

    洛谷 P3902 递增 洛谷传送门 JDOJ 2157: Increasing JDOJ传送门 Description 数列A1,A2,--,AN,修改最少的数字,使得数列严格单调递增. Input ...

  10. Active Ball

    Active Ball is a simple game. All you need to do is aim at the food and shoot it, then collect the m ...