这里的代码都是源项目中的代码,示例项目sample文件夹下的代码,或者test文件夹下的代码。

nancy中的Stateless验证的实现 ,示例中的方法要比token简单容易看的多。不像token中的FileSystemTokenKeyStore方式,用文件保存,每次全部读取,实现也麻烦。

StatelessAuthBootstrapper 是sample中的用来演示用的自定义代码,实现了DefaultNancyBootstrapper。

var apiKey = (string) nancyContext.Request.Query.ApiKey.Value;

//get the user identity however you choose to (for now, using a static class/method)
                      return UserDatabase.GetUserFromApiKey(apiKey);

每次获取apikey 然后获取用户信息。

现在转到UserDatabase的类,

static readonly List<Tuple<string, string>> ActiveApiKeys = new List<Tuple<string, string>>();
      private static readonly List<Tuple<string, string>> Users = new List<Tuple<string, string>>();

定义了2个list,Users代表我们的数据库的用户表,保存用户的信息等。

ActiveApiKeys 用来保存登陆后的apikey等,类似早期的保存的session的库,只不过早期通常是服务器进程自动维护。这里我们可以用memcache,或者redis来代替。

在ValidateUser的方法中,有这么一句  var apiKey = Guid.NewGuid().ToString();  用来产生apikey。  一般guid足够了,当然你也可以把它进行加密,就会更加碰撞不到了。

DemoUserIdentity 的属性比较少,可以自己添加角色等要用来验证的必要信息。

ActiveApiKeys  也可以用自己的方式来验证,反正Tuple可以加7个参数的内容,下面是token方式验证中的Tokenizer类,里面包含的部分字段。 我们也可以这样去做,

例如加入apikey的过期时间,验证时可以直接设置apikey过期。

加入刷新apikey时间,在apikey过期的时候,例如30秒内,可以用旧的的apikey交换新的apikey。类似taobao的刷新token。

private Encoding encoding = Encoding.UTF8;
       private string claimsDelimiter = "|";
       private string hashDelimiter = ":";
       private string itemDelimiter = Environment.NewLine;
       private Func<DateTime> tokenStamp = () => DateTime.UtcNow;
       private Func<DateTime> now = () => DateTime.UtcNow;
       private Func<TimeSpan> tokenExpiration = () => TimeSpan.FromDays(1);
       private Func<TimeSpan> keyExpiration = () => TimeSpan.FromDays(7);

nancy中的Stateless验证的更多相关文章

  1. nancy中的身份验证

    在nancy中,身份验证分为basic ,form ,token,stateless几种,basic和form这里不说了,其中如果是使用cookie来保存身份的, 需要注意的是:cookie有大小的限 ...

  2. 浅析如何在Nancy中使用Swagger生成API文档

    前言 上一篇博客介绍了使用Nancy框架内部的方法来创建了一个简单到不能再简单的Document.但是还有许许多多的不足. 为了能稍微完善一下这个Document,这篇引用了当前流行的Swagger, ...

  3. ASP.NET MVC5中的Model验证

    Model验证是ASP.NET MVC中的重要部分,它主要用于判断输入的数据类型及值是否符合我们设定的规则,这篇文章就介绍下ASP.NET MVC中Model验证的几种方式. 后台验证 DataAnn ...

  4. 用Retrofit发送请求中添加身份验证

    用Retrofit发送请求中添加身份验证====================在安卓应用开发中, retrofit可以极大的方便发送http网络请求,不管是GET, POST, 还是PUT, DEL ...

  5. 防御CSRF的方法有哪些(一) HTTP 头中自定义属性并验证 CSRF跨站域请求伪造攻击

    CSRF (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下 ...

  6. nancy中视图呈现 Html.Partial(RenderPage的替代品)

    在mvc中有RenderPage 用来呈现其他视图的内容,而在nancy中没有RenderPage.怎么办呢? mvc中RenderPage的替代品,就是 Html.Partial. 使用方式 @Ht ...

  7. Azure Service Bus 中的身份验证方式 Shared Access Signature

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  8. WPF中的数据验证

    数据验证 WPF的Binding使得数据能够在数据源和目标之间流通,在数据流通的中间,便能够对数据做一些处理. 数据转换和数据验证便是在数据从源到目标 or 从目标到源 的时候对数据的验证和转换. V ...

  9. Lotus开发之Lotus Notes中域的验证

    一:介绍       Lotus中的域主要有以下的类型:文本,日期/时间,对话框列表,复选框,单选按钮,RTF等等.Lotus中域的验证方式有很多种公式,lotusscript,javascript等 ...

随机推荐

  1. Bootstrap-Plugin:轮播(Carousel)插件

    ylbtech-Bootstrap-Plugin:轮播(Carousel)插件 1.返回顶部 1. Bootstrap 轮播(Carousel)插件 Bootstrap 轮播(Carousel)插件是 ...

  2. APR介绍

    http://blog.csdn.net/jmshl/article/details/6773731 APR分析-整体篇 由于部门所使用的底层库与Apache Server有着“一定的渊源”,所以总有 ...

  3. UI“三重天”之appium(一)

    官方介绍: Appium is an open-source tool for automating native, mobile web, and hybrid applications on iO ...

  4. 基于C++11实现的线程池

    1.C++11中引入了lambada表达式,很好的支持异步编程 2.C++11中引入了std::thread,可以很方便的构建线程,更方便的可移植特性 3.C++11中引入了std::mutex,可以 ...

  5. nginx收到空包问题

    tcpdump有收包,但是nginx的access.log显示post数据为空 可以通过tcpdump监控端口 http://www.cnblogs.com/linn/p/4792468.html 修 ...

  6. [ML] CostFunction [Octave code]

    function J = computeCostMulti(X, y, theta) m = length(y); % number of training examples J = 0; for i ...

  7. 常见的linux服务器构建

    Linux常用服务器构建-ftp服务器 ftp服务器 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”. 用于Internet上的控制文件的双 ...

  8. 关于directshow的SmartTee

    可以通过CLSID_SmartTee创建: CComPtr<IBaseFilter> pSmartTee; // Create the Smart Tee (CLSID_SmartTee) ...

  9. 将bmp文件转换为jpg文件

    procedure TForm1.Button1Click(Sender: TObject);(*压缩MBP为JPEG;但是没有提供压缩比可选项凑合用吧,大概1/3 ^_^:Note:必须加上JPEG ...

  10. MyBatis 延迟加载 加载时机