前言:

前两天,当我还在老家收拾行旅,准备回广州,为IT连的创业再战365天时,

有网友扣上问:Taurus.MVC中如何实现认证和权限控制,最好能做个小例子。

我一不小心回了句:等回广州我再写篇文章......

然后,今天就来补文章了〜〜〜〜

Taurus.MVC Nuget 更新:

写文之前,又提前花了点时间,把Nuget的Package升级了一下,和源码版本做了下同步。

通常源码的版本都会比Nuget包的靠前一个小版本:

目前:Taurus.MVC 升级到:V2.2.3.4 (CYQ.Data 同步升级到:V5.7.8.3)

最近版本的更新内容:

V2.2.3.(--)
:增加CheckFormat方法【支持参数为空或正则验证】 V2.2.3.(--)
:增加方法参数的支持(兼容常规webapi的使用方法)
:CYQ.Data同时升级到V5.7.7. V2.2.3.(--,--)
:增强跨域支持
:修正Query<T>(aaa,defaultValue)的默认取的取值顺序问题。
:增加EndInvode事件和BenginInvode的事件执行顺序调整。
:CYQ.Data同时升级到V5.7.8.

Taurus.MVC 增强功能:兼容常规WebAPI参数写法

比如对于以下请求:

itlinks.cn/user?uid=
itlinks.cn/user/uid/

常规获取参数:

        public void Get()
{
int uid = Query<int>("uid");
}

兼容性写法:

        public void Get(int uid)
{ }

同时,兼容参数还可以很复杂,比如这种:

        public void GetData(List<AB> unList,string a,int? b,AB ab)
{
Write("your data A:" + unList[].A+" your data B:" + unList[].B, true);
}

传递对应的Post的Json可能是这样的(手打的,就省了双引号了):

{ uiList:[{a:,b:} , {a:,b:}]  ,a:1 ,b:2 ,ab:{a:,b:}}

以IT连示例:WebAPI 解决方案:

先看:IT连的后端WebApi解决方案:

再说:解决方案的创建步骤:

1:新建空Web应用程序。

即上图的:ITLinks.API ,WebAPI不需要界面,该应用程序用于存放各种Controller即可。

2:在项目的引用中用Nuget包管理引入Taurus.MVC。

Nuget包管理会自动在Web.Config中加入以下相关配置。

需要把:key=“Taurus.Controllers” 项的值:改成控制器存放的项目名称(一般名称和最终生成的dll同名)。

Taurus.MVC被引用后,仅包含两个dll,Taurus.Core和CYQ.Data。

IT连的解决方案中,对这两个dll使用了源码项目(方便于作者本人做调试或扩展功能)。

3:项目中新建各种Controller(创建请求规则)。

以IT连中的黑名单功能为例,控制器应继承自Taurus.Core.Controller:

(这里要注意一下构造函数,将自身this传递给逻辑类的构造函数)

namespace ITLinks.API
{
public class BlacklistController : Taurus.Core.Controller
{
BlacklistLogic blacklist;
public BlacklistController()
{
blacklist = new BlacklistLogic(this);
}
/// <summary>
/// 获取黑名单
/// </summary>
[Token]
public void GetList()
{
string result = blacklist.GetList();
Write(result);
}
[Token]
public void Set()
{
string result = blacklist.Set();
Write(result);
}
}
}

因Web.Config中的路由类型配置为1,即路由方式为:

/控制器名称/方法名/参数

即创建了以下两个路径请求:

/blacklist/getlist
/blacklist/set

理论上来说,在可以方法里写业务代码,并调用Write方法输出json格式的字符串即完成了。

不过,实际项目中,需要清晰一些的规划:

IT连的项目中,控制器被规划用来定义路由及权限等简单设定(不包括具体的业务代码)。

把业务代码分离到ITLinks.Logic项目中处理了:

业务逻辑类继承自:Taurus.Core.LogicBase(继承后可复用Taurus.Core.Controller中的常用方法,如Query<T>(xxx)获取参数)

如:IT连黑名单列表中的黑名单逻辑源码示例:

(这里要注意一下构造函数,定义继承父类接收控制器参数的构造函数方法)

对于IT连的的业务逻辑:

一部分:独立到解决方案ITLinks.CommonLogic中。

用于功能的复用(在ASP.NET Aries的管理后台和此处的WebApi中复用同一份代码)

一部分:独立到解决方案ITlinks.Aop中。

用于一些第三方的消息处理。

这些,就不细讲了~~~直接飘过!

OK,接下来,我们将重点聚焦在权限安全认证这一块:

Taurus.MVC WebAPI 权限安全认证

写此之前,又扫看了一下之前写的关于Taurus.MVC的文章,发现一共才五篇,其中:

Taurus.MVC 2.0 开源发布:WebAPI开发教程 ,步骤五:有简单提到对于权限控制这一块的处理,只是不够详尽。

本文,就以 IT连 App的后端 WebAPI 的逻辑来给大伙做进一步细致说明:

首先:对于继承自Taurus.Core.Controller的控制器,都拥有以下几个可重写的方法:

    public class TestController : Taurus.Core.Controller
{
public override bool CheckToken() { }
public override bool BeforeInvoke(string methodName) { }
public override void EndInvoke(string methodName) { }
}

以及三个权限相关的特性[Token]、[HttpGet]、[HttpPost]:

    [Token]
public class TestController : Taurus.Core.Controller
{
[HttpGet]
public void Get()
{ }
[HttpPost]
public void Post()
{ }

特性若放在类上,即对所有方法都生效!

整个的调用顺序为:

:调用CheckToken(如果方法标识[Token]属性)【如果返回false则中止以下执行,可人工干预
:检测Get或Post(如果方法标识[HttpGet]或[HttpPost]属性)【如果返回false则中止以下执行,系统自动控制
:调用BeforeInvoke方法【如果返回false则中止以下执行,可人工干预
:调用我们定义的方法,如Get或Post方法。
:调用EndInvoke方法。

接下来,再以IT连中的请求为例讲述流程:

1:用户首次打开IT连App时,获取App的版本更新及配置信息:

此时不需权限,一切正常定义,如:

    public class SysController : Controller
{
SysLogic sysLogic = null;
public SysController()
{
sysLogic = new SysLogic(this);
}
/// <summary>
/// 获取配置信息
/// </summary>
public void GetConfig()
{
string msg = sysLogic.GetConfig();
Write(msg);
} /// <summary>
/// App版本升级
/// </summary>
public void Update()
{
string msg = sysLogic.CheckAppVersion();
Write(msg);
}

2:用户登陆或注册App:

登陆注册也不需要权限验证,方法依旧如常。

    public class UserController : Controller
{
UserLogic user;
public UserController()
{
user = new UserLogic(this);
}
public void Register()
{
string result = user.Register();
Write(result);
}
public void Login()
{
string result = user.Login();
Write(result);
}

不过,在登陆或注册成功后,需要创建一个Token返回给App客端存档:

如何创建Token:

可以把用户的基本固定又不重要的信息串在一起,然后加下密就可以了;

比如:(用户ID+注册时间+用户名+有效日期)=》加密成:abfabcbcdxxabfabccdc

具体代码可参考 ASP.NET Aries 框架中的 UserAuth.cs 中的 GetAuthToken 方法

3:用户进入主界面,或再次打开App时:

由于用户在注册或登陆时,已经存档了Token在客户端,只要之后的请求,都带上这个Token即可。

比如用户获取自身的完整信息,或提交用户反馈是需要权限的:

    public class FeedbackController : Controller
{
FeedbackLogic feedbackLogic = null;
public FeedbackController()
{
feedbackLogic = new FeedbackLogic(this);
} public override bool CheckToken()
{
string userid = UserAuth.UserID;//从用户传来的Token中解密获取数据
bool result = !string.IsNullOrEmpty(userid) && UserAuth.UserID.Length == && UserAuth.RegTime.Length == ;
if (!result)
{
Write(LangConst.EC_10000, false);//返回Token验证失败
}
return result;
}
/// <summary>
/// 用户反馈建议
/// </summary>
/// <returns></returns>
[Token]
public void Set()
{
string result = feedbackLogic.Set();
Write(result);
}
}

对于Set方法,需要基本的身份认证,加上了[Token]特性;

同时:需要在CheckToken方法写代码来检测用户带过来的Token是否合法:

:从请求数据或请求头中获取(Token字符串)

:解密,较验格式及是否过期。

:根据解密的结果,来返回true或false。
具体代码仍可参考 ASP.NET Aries 框架中的 UserAuth.cs 中UserID属性是怎么被反解出来的。

这样,就完成了基本的权限认证。

Taurus.MVC WebAPI 特殊的 DefaultController

鉴于检测Token合法性的代码是一样的,业务控制器可能不少,因此需要有统一的地方:

Taurus.MVC定义了三个全局的方法,位于DefaultController中,当然这个控制器文件默认是不存在的,需要自己新建:

    public class DefaultController : Controller
{ public static bool CheckToken(IController controller, string methodName)
{
//将Token验证合法性的代码写在这全局的地方,对所有的Controller都生效。

string userid = UserAuth.UserID;
             bool result = !string.IsNullOrEmpty(userid) && UserAuth.UserID.Length == 36 && UserAuth.RegTime.Length == 8;
             if (!result)
             {
                    controller.Write(LangConst.EC_10000, false);
             }
             return result;

        }
public static bool BeforeInvoke(IController controller, string methodName)
{ }
public static void EndInvoke(IController controller, string methodName)
{ } }

DefaultController的全局方法的优先级:

这三个static方法的优先级,低于Controller自身同名的实例方法;

即如果某个Controller已经重写了CheckToken实例方法,则全局的CheckToken不会被调 用,其它两个方法亦同。

DefaultController是Taurus.MVC的特殊的控制器,其特殊在:

:当寻找的控制器不存在时,都会定位到DefaultController中寻找,如果DefaultController也没有,则抛出异常。

:如果方法在DefaultController中找不到时,则会调用Default方法(Taurus.Core.Controller有默认Default方法,可被重写)。

3:三个全局的统一方法,被命运安排在这里。

总结:

你值的拥有!

接下来又得把线程切回去继续写IT连创业系列、以及IOS的Sagit.Framework开发框架系列了!

Taurus.MVC 2.2.3.4 :WebAPI 实现权限控制认证(及功能增强说明)的更多相关文章

  1. Taurus.MVC 2.3.4 :WebAPI 文档集成测试功能升级:WebAPI批量自动化测试功能。

    前言: 最近升级了一下Taurus.MVC,现在最新版本是:Taurus.MVC 2.3.4,源码版本和nuget同步. 下面分三个步骤介绍下新版本的WebAPI批量自动化测试功能. 1.启用WebA ...

  2. Taurus.MVC 2.3.2 :WebAPI 文档集成测试功能及附加<%# JS执行功能语法 %>

    前言: 前些天有网友提到了那个界面丑陋的SwaggerUI,让我想起了多年前实现的WebAPI文档未完成的功能点,于是,动手了,便有了本文的内容. 开源地址:https://github.com/cy ...

  3. 在ASP.NET MVC里对Web Page网页进行权限控制

    我们在ASP.NET MVC开发时,有时候还是得设计ASP.NET的Web Page网页(.aspx和.aspx.cs),来实现一些ASP.NET MVC无法实现的功能,如此篇<Visual S ...

  4. MVC开发模式下的用户角色权限控制

    前提: MVC开发模式 大概思想: 1.在MVC开发模式下,每个功能都对应着不同的控制器或操作方法名(如修改密码功能可能对应着User/changepd),把每个功能对应的控制器名和操作方法名存到数据 ...

  5. Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)

    背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...

  6. Taurus.MVC 微服务框架 入门开发教程:项目集成:4、默认安全认证与自定义安全认证。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  7. Taurus.MVC 2.0 开源发布:WebAPI开发教程

    背景: 有用户反映,Tausus.MVC 能写WebAPI么? 能! 教程呢? 嗯,木有! 好吧,刚好2.0出来,就带上WEBAPI教程了! 开源地址: https://github.com/cyq1 ...

  8. GJM : Taurus.MVC 2.0 开源发布:WebAPI开发教程 [转载]

    Taurus.MVC 2.0 开源发布:WebAPI开发教程 转载自http://www.cnblogs.com/cyq1162/p/6069020.html 因是新手  粘贴时有一个版权问题 本文原 ...

  9. Taurus.MVC 2.3 开源发布:增强属性Require验证功能,自带WebAPI文档生成功能

    背景: 上周,把 Taurus.MVC 在 Linux (CentOS7) 上部署任务完成后. 也不知怎么的,忽然就想给框架集成一下WebAPI文档功能,所以就动手了. 以为一天能搞完,结果,好几天过 ...

随机推荐

  1. xtrabackup全量备份和增(差)量备份

    xtrabackup全量备份和增(差)量备份 1.xtrabackup全量备份和恢复 1)备份: innobackupex --default-file=/PATH/TO/DEFAULT --host ...

  2. 百万级别QPS轻量级PHP框架Steeze介绍

    系统简介   Steeze是一个优雅.简洁而又高效的PHP开源框架,在整合了知名框架ThinkPHP和Laravel优点的同时,重写了底层架构,增强了功能实现. 支持swoole模型运行,支持容器.模 ...

  3. Nodejs+Grunt配置SASS项目自动编译

    Nodejs+Grunt配置SASS项目自动编译 早前听说Nodejs和Grunt很强大,特别是用来构建自动化的前端开发,更是强大无比.但一直碍于自己掌握的技术有限,不敢深入,也未曾深入下去.最近在开 ...

  4. mysql数据库管理工具navicat for mysql怎么用

    mysql数据库管理工具navicat for mysql,对于不怎么喜欢图形界面或者不太方便使用SQL的时候.我们可以通过用这个图形界面数据库管理工具来管理mysql,本经验咗嚛就简单介绍一下怎么用 ...

  5. 前端css常用class命名id命名

    1.常用id的命名: (1)页面结构 容器: container 页头:header 内容:content/container 页面主体:main 页尾:footer 导航:nav 侧栏:sideba ...

  6. PHP数据核心:Zend HashTable详解

    最近看了篇关于php内的hashtable的文章,PHP数据存储的核心,各种常量.变量.函数.类.对象等都用它来组织的.转载地址 http://www.phppan.com/2009/12/zend- ...

  7. 控制台调用天气API例子

    第一步,新建控制台应用程序,然后新建类:WeatherReport: using System; using System.Collections.Generic; using System.Linq ...

  8. junit4X系列--Runner解析

    前面我整理了junit38系列的源码,那junit4X核心代码也基本类似.这里我先转载一些关于junit4X源码解析的好文章.感谢原作者的分享.原文地址:http://www.blogjava.net ...

  9. 解决跨站脚本注入,跨站伪造用户请求,sql注入等http安全漏洞

    跨站脚本就是在url上带上恶意的js关键字然后脚本注入了,跨站伪造用户请求就是没有经过登陆,用超链接或者直接url上敲地址进入系统,类似于sql注入这些都是安全漏洞. sql注入 1.参数化查询预处理 ...

  10. Gitlab备份与恢复[七]

    标签(linux): git 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 备份 配置文件中加入 gitlab_rails['bakup_path']='/da ...