Nancy跨平台开发总结(六)三层架构之Token认证的Rest API
在开始写本节内容前,我使用Nancy.Authentication.Token实现的Token认证,但是就在我开始写本节内容的时,我看到Nancyfx的文档中的内容更新
所以我改为使用Nancy.Authentication.Stateless自己实现Token认证
- 新一个空的Asp.net Web项目,添加Nuget包
- Owin
- Nancy
- Nancy.Owin
- Nancy.Bootstrappers.Autofac
- Microsoft.Owin.Host.SystemWeb
- Nancy.Authentication.Stateless
- EntityFramework
- Mysql.Data
- Mysql.Data.Entity
从上一节中的WebSite项目中拷贝以下几个文件,修改命名空间,修改Bootstrapper去掉Form认证的相关代码
- 在Models文件夹下新建一个AuthModel类文件,代码如下
using System.Collections.Generic;using Nancy.Security; using Nop.Core.Caching;namespace WebSite.WebApi.Models {/// <summary>/// 代表经过认证的用户/// </summary>public class UserIdentity : IUserIdentity{public UserIdentity(string userName) :this(userName, new List<string>()){}public UserIdentity(string userName, IEnumerable<string> claims){this.UserName = userName;this.Claims = claims;}public IEnumerable<string> Claims{get; private set;}public string UserName{get; private set;}}/// <summary>/// 包含生成token和校验token的静态方法/// </summary>public class UserMapper{private static readonly MemoryCacheManager manager = new MemoryCacheManager();/// <summary>/// 根据token获取用户信息,检测用户是否有效/// </summary>/// <param name="token"></param>/// <returns></returns>public static IUserIdentity GetUserFromAccessToken(string token){if (string.IsNullOrEmpty(token)){return null;}return manager.Get<UserIdentity>(token);}/// <summary>/// 生成一个新的token,并缓存/// </summary>/// <param name="userName"></param>/// <returns></returns>public static string GenerateToken(string userName){string token= Guid.NewGuid().ToString();//token有效期manager.Set(token, new UserIdentity(userName),60*24);return token;}}}
- 在Bootstrapper的RequestStartup事件中添加配置stateless认证.
pipelines.AfterRequest.AddItemToEndOfPipeline(x =>{x.Response.Headers.Add("Access-Control-Allow-Origin", "*");x.Response.Headers.Add("Access-Control-Allow-Methods", "POST,GET,DELETE,PUT,OPTIONS");}); var configuration =new StatelessAuthenticationConfiguration(nancyContext =>{//返回null代码token无效或用户未认证string token = nancyContext.Request.Headers.Authorization;if (!string.IsNullOrEmpty(token)){return UserMapper.GetUserFromAccessToken(token);}else{return null;}});StatelessAuthentication.Enable(pipelines, configuration);
- 在UserService中添加根据Id查找用户信息的方法,并在IUserService中添加对应接口
/// <summary> /// Gets the User by identifier. /// </summary> /// <returns>The User by identifier.</returns> /// <param name="id">Identifier.</param> public virtual User GetUserById(int id) {if (id == 0) return null;string key = string.Format(Users_BY_ID_KEY, id);var user = _cacheManager.Get(key, () => userRepository.GetById(id));return user; }
- 在Controller中建一个类AuthController类,用于验证用户并生成Token,代码如下
private IUserService service; public AuthController(IUserService service) : base("token") {this.service = service;Post["/"] = x =>{var user = this.Bind<User>();return GetToken(user.UserName, user.Password);}; }private object GetToken(string username, string password) {DataResult<User> result = service.ValidateUser(username, password);if (result.Result == 0){return new{error = "认证失败!",error_description = result.Message,};}else{return new{access_token = UserMapper.GenerateToken(username),};} }
- 添加UserController,根据Id获取用户信息,并限定访问接口必须认证后才能使用
public class UserController:NancyModule {private IUserService service;public UserController(IUserService service):base("api/user"){//限制认证this.RequiresAuthentication();this.service = service;//异步模型Get["/{Id}", true] = async (_, ct) =>{User user = await Task.Run(() =>{return service.GetUserById(_.Id);});return user;};} }
- 建一个WebSite.Test的控制台应用程序,通过nuget添加RestSharp引用包,在Main函数中添加以下代码测试接口
RestClient client = new RestClient("http://localhost:56751"); string result = string.Empty;var request = new RestRequest("/token"); var body = new {grant_type = "password",username = "admin",password = "1234567" }; request.AddObject(body); IRestResponse response = client.Post(request); result = response.Content; dynamic content = SimpleJson.DeserializeObject(result); ; if (response.StatusCode != HttpStatusCode.OK) {string error = content.error_description;return; }string token = content.access_token; var request2 = new RestRequest("/api/user/1"); request2.AddHeader("Authorization", token); IRestResponse response2 = client.Get(request2); if (response2.StatusCode == HttpStatusCode.OK) {result = response2.Content; }
转载于:https://www.cnblogs.com/lpush/p/5234712.html
Nancy跨平台开发总结(六)三层架构之Token认证的Rest API相关推荐
- mysql 三层架构开发_从三层架构迈向领域驱动设计(转载)
三层架构 严格分层架构模式的特点是上层只能访问相邻的下层,其他层次间的调用都不允许.三层架构就是一种严格分层模式,它把职责划分为界面展示.业务逻辑.数据访问三层,还有一个业务实体,前面三层都要依赖它, ...
- 【ASP.NET开发】.NET三层架构简单解析
这篇文章本来应该很早就写出来的,但是一直苦于自己的精神能力有限,而且已经到了我们学校的考试周,所以时间上还是有点紧迫.关键的一点就是,找不到合理的思路来写,思路没有的话,就算是再好的素材,也写不来大家 ...
- 跟着项目学设计模式(六):三层架构
前面用5个章节介绍了单例模式和工厂系列模式,这个过程中,如果算上网站开发人员的表示层,那么项目经历了二层到多层的演变: 数据访问层+表示层 => 数据访问层+业务逻辑层+Client层+表示层 ...
- Nancy跨平台开发总结(三)发布到Jexus Web服务器
在Centos7上安装Mono yum install yum-utils rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=g ...
- MySQL的三层架构(连接认证、解析优化和存储引擎)
对于数据库的认识,相信很大一部分人像我一样只停留在写各种SQL.优化各种查询语句以及索引的建立之上,只是停留在"会用"的基础上.但是如果想要充分发挥MySQL的性能,就必须要了解其 ...
- 浅谈三层架构 通过这个,+Java开发模式经验。终于相通了,动软到底是为什么这么做...
浅谈三层架构 收藏 自己理解的原理 http://www.cnblogs.com/mahaisong/archive/2011/05/12/2044665.html 浅谈三层架构 通过这个,+Jav ...
- 第六章节 三层架构(一. 三层架构的概述)
一. 三层架构的概述 1.在大中型ASP.NET站点的设计开发中,通常采用三层架构的设计,既表现层.业务逻辑层.数据访问层,各层特点简述如下: 层级 说明 表现层 (UI) 用于显示数据和接收用户输入 ...
- Spring Boot开发基于三层架构设计:Dao层、Service层、Controller层
三层架构设计:基于Spring Boot开发要使用三层架构: 数据访问层(Dao).业务逻辑层(Service).控制层(Control-ler) (1)数据访问层(Dao):Dao层是最底层的设计, ...
- 原生革命--跨平台开发技术解析
这篇文章,我将着重分析当前主流跨平台开发解决方案(偏架构)如Flutter.RN.Weex.Hybrid App,并对新晋跨端解决方案Fusion和Chameleon做一些分析,在传统原生开发不断被唱 ...
最新文章
- JZOJ 5932. 【NOIP2018模拟10.27】情报中心
- 听说你盗图都盗绿了?
- Java转JSON串的几种方式
- 高性能自旋锁 MCS Spinlock 的设计与实现(来自IBM)
- 通用即插即用监视器驱动下载_DirectX10下载|DirectX10 10.1 官方版
- sdr 软件_将永远改变我们业余无线电爱好的SDR软件定义无线电技术
- VSS无法访问 (0x80072EFD) 转载
- 一图带你了解全球疫情爆发背后的隐藏机会
- [读后感]从Code Review 谈如何做技术
- 海康设备通过SDK获取和设置设备网络参数
- Formality笔记
- pandas分组聚合
- return 与 return false、return turn的常见用法
- C64+ cache资料集(更新中)
- PPT学习整理(三)合并形状
- java 运动的大球吃小球_大球吃小球
- teradata ttu_【Teradata TTU】Windows TTU安装工具列表,
- construct2制作飞机大战游戏
- hutool的 DateUtil工具类相关方法
- 小白如何用Python脚本玩转跳一跳
热门文章
- 执行计算机查错程序,计算机 每次启动过程中总会执行磁盘检查CHKDSK,什么问题???怎么处理??...
- mysql挂载数据卷_docker卷挂载技术
- 海南计算机考研和培训哪个比较好,海南考研集训营前十排名
- mysql一张表可以用吗_MySQL表操作
- C语言排序方法------快速排序
- C++程序代码:类实现——【calculator】计算器程序设计
- 遍历map时删除不需要的元素方法
- how to make milt-Lang windows installer All in 1
- 深度浅析:国民产业链两大泡沫
- MySQL/MariaDB表表达式(3):视图