在开始写本节内容前,我使用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相关推荐

  1. mysql 三层架构开发_从三层架构迈向领域驱动设计(转载)

    三层架构 严格分层架构模式的特点是上层只能访问相邻的下层,其他层次间的调用都不允许.三层架构就是一种严格分层模式,它把职责划分为界面展示.业务逻辑.数据访问三层,还有一个业务实体,前面三层都要依赖它, ...

  2. 【ASP.NET开发】.NET三层架构简单解析

    这篇文章本来应该很早就写出来的,但是一直苦于自己的精神能力有限,而且已经到了我们学校的考试周,所以时间上还是有点紧迫.关键的一点就是,找不到合理的思路来写,思路没有的话,就算是再好的素材,也写不来大家 ...

  3. 跟着项目学设计模式(六):三层架构

    前面用5个章节介绍了单例模式和工厂系列模式,这个过程中,如果算上网站开发人员的表示层,那么项目经历了二层到多层的演变: 数据访问层+表示层 => 数据访问层+业务逻辑层+Client层+表示层 ...

  4. Nancy跨平台开发总结(三)发布到Jexus Web服务器

    在Centos7上安装Mono yum install yum-utils rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=g ...

  5. MySQL的三层架构(连接认证、解析优化和存储引擎)

    对于数据库的认识,相信很大一部分人像我一样只停留在写各种SQL.优化各种查询语句以及索引的建立之上,只是停留在"会用"的基础上.但是如果想要充分发挥MySQL的性能,就必须要了解其 ...

  6. 浅谈三层架构 通过这个,+Java开发模式经验。终于相通了,动软到底是为什么这么做...

    浅谈三层架构 收藏 自己理解的原理 http://www.cnblogs.com/mahaisong/archive/2011/05/12/2044665.html 浅谈三层架构  通过这个,+Jav ...

  7. 第六章节 三层架构(一. 三层架构的概述)

    一. 三层架构的概述 1.在大中型ASP.NET站点的设计开发中,通常采用三层架构的设计,既表现层.业务逻辑层.数据访问层,各层特点简述如下: 层级 说明 表现层 (UI) 用于显示数据和接收用户输入 ...

  8. Spring Boot开发基于三层架构设计:Dao层、Service层、Controller层

    三层架构设计:基于Spring Boot开发要使用三层架构: 数据访问层(Dao).业务逻辑层(Service).控制层(Control-ler) (1)数据访问层(Dao):Dao层是最底层的设计, ...

  9. 原生革命--跨平台开发技术解析

    这篇文章,我将着重分析当前主流跨平台开发解决方案(偏架构)如Flutter.RN.Weex.Hybrid App,并对新晋跨端解决方案Fusion和Chameleon做一些分析,在传统原生开发不断被唱 ...

最新文章

  1. JZOJ 5932. 【NOIP2018模拟10.27】情报中心
  2. 听说你盗图都盗绿了?
  3. Java转JSON串的几种方式
  4. 高性能自旋锁 MCS Spinlock 的设计与实现(来自IBM)
  5. 通用即插即用监视器驱动下载_DirectX10下载|DirectX10 10.1 官方版
  6. sdr 软件_将永远改变我们业余无线电爱好的SDR软件定义无线电技术
  7. VSS无法访问 (0x80072EFD) 转载
  8. 一图带你了解全球疫情爆发背后的隐藏机会
  9. [读后感]从Code Review 谈如何做技术
  10. 海康设备通过SDK获取和设置设备网络参数
  11. Formality笔记
  12. pandas分组聚合
  13. return 与 return false、return turn的常见用法
  14. C64+ cache资料集(更新中)
  15. PPT学习整理(三)合并形状
  16. java 运动的大球吃小球_大球吃小球
  17. teradata ttu_【Teradata TTU】Windows TTU安装工具列表,
  18. construct2制作飞机大战游戏
  19. hutool的 DateUtil工具类相关方法
  20. 小白如何用Python脚本玩转跳一跳

热门文章

  1. 执行计算机查错程序,计算机 每次启动过程中总会执行磁盘检查CHKDSK,什么问题???怎么处理??...
  2. mysql挂载数据卷_docker卷挂载技术
  3. 海南计算机考研和培训哪个比较好,海南考研集训营前十排名
  4. mysql一张表可以用吗_MySQL表操作
  5. C语言排序方法------快速排序
  6. C++程序代码:类实现——【calculator】计算器程序设计
  7. 遍历map时删除不需要的元素方法
  8. how to make milt-Lang windows installer All in 1
  9. 深度浅析:国民产业链两大泡沫
  10. MySQL/MariaDB表表达式(3):视图