同样和前面一样新建一个空的Web项目,都在根目录添加Module,Models,Views文件夹

添加Nuget包

在Models文件夹里面添加UserModel类

        public string Username { get; set; }
public UserModel(string username)
{
Username = username;
}

在Models文件夹里面添加Userdatabase类

        static readonly List<Tuple<string, string>> ActiveApiKeys = new List<Tuple<string, string>>();
private static readonly List<Tuple<string, string>> User = new List<Tuple<string, string>>();
static UserDatabase()
{
User.Add(new Tuple<string, string>("Lexan","password"));
User.Add(new Tuple<string, string>("User","password"));
}
public static ClaimsPrincipal GetUserFromApiKey(string apiKey)
{
var activeKey = ActiveApiKeys.FirstOrDefault(x=>x.Item2==apiKey);
if (activeKey==null)
{
return null;
}
var userRecord = User.First(x=>x.Item1==activeKey.Item1);
return new ClaimsPrincipal(new GenericIdentity(userRecord.Item1,"Lexan"));
}
public static string ValidateUser(string username,string password)
{
//尝试从 "数据库" 中获取与给定用户名和密码匹配的用户
var userRecord = User.FirstOrDefault(x=>x.Item1==username&&x.Item2==password);
if (userRecord==null)
{
return null;
}
//既然用户已被验证, 请创建一个可用于后续请求的 api 密钥。
var apiKey = Guid.NewGuid().ToString();
ActiveApiKeys.Add(new Tuple<string, string>(username,apiKey));
return apiKey;
}
public static void RemoveApiKey(string apiKey)
{
var apiKeyToRemove = ActiveApiKeys.First(x=>x.Item2==apiKey);
ActiveApiKeys.Remove(apiKeyToRemove);
}
public static Tuple<string, string> CreateUser(string username, string password)
{
var user = new Tuple<string, string>(username,password);
User.Add(user);
return user;
}

在Module文件夹中添加AuthModule类,如下代码

public class AuthModule:NancyModule
{
//post ["/login"] 方法主要用于获取后续调用的 api 密钥
public AuthModule():base("/auth/")
{
Post("/", Lexan =>
{
var apiKey = UserDatabase.ValidateUser((string) this.Request.Form.Username,
(string)this.Request.Form.Password);
return string.IsNullOrEmpty(apiKey) ? new Response { StatusCode = HttpStatusCode.Unauthorized }
: this.Response.AsJson(new { ApiKey=apiKey});
});
//销毁关键api 密钥
Delete("/",Lexan=>
{
var apiKey = (string)this.Request.Form.ApiKey;
UserDatabase.RemoveApiKey(apiKey);
return new Response { StatusCode=HttpStatusCode.OK};
});
}

在Module文件下添加RootModule类

        public RootModule()
{
Get("/",Lexan=>this.Response.AsText(
"这是一个 rest api,它是在另一个 vs 项目" +
"演示一个普通的 rest api 在" +
"从其他网站或应用程序访问它" +
"了解网站如何访问此 api, 运行" +
"Stateless.Web项目"+
"和构建Web同一项目中"
));
}

在Module文件夹下添加SecureModule类

public SecureModule()
{
Get("secure",Lexan=>
{
var identity = this.Context.CurrentUser;
var userModel = new UserModel(identity.Identity.Name);
return this.Response.AsJson(
new {
SecureContent= "下面是一些安全的内容, 只能看到你提供了正确的 apikey",
User=userModel
});
});
Post("/secure/creat_user",Lexan=>
{
Tuple<string, string> user = UserDatabase.CreateUser(this.Context.Request.Form["username"],
this.Context.Request.Form["password"]);
return this.Response.AsJson(new { username=user.Item1});
});
}

继续在根目录添加StatelessBootstrapper

        protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context)
{
//在请求启动时, 我们修改请求管线
//包括无状态身份验证
//配置无状态身份验证很简单。只需使用
//NancyContext 得到 apiKey。然后, 使用 apiKey 获取
//用户的身份。
//// base.RequestStartup(container, pipelines, context);
var configuration = new StatelessAuthenticationConfiguration(nancyContext =>
{
var apiKey = (string)nancyContext.Request.Query.ApiKey.Value;
return UserDatabase.GetUserFromApiKey(apiKey);
});
AllowAccessToConsumingSite(pipelines);
StatelessAuthentication.Enable(pipelines,configuration);
}
static void AllowAccessToConsumingSite(IPipelines pipelines)
{
pipelines.AfterRequest.AddItemToEndOfPipeline(x =>
{
x.Response.Headers.Add("访问-控制-允许-起源", "*");
x.Response.Headers.Add("访问-控制允许-方法", "开机自检、获取、删除、放入、选项");
});
}

再来看看运行的结果

成功了,谢谢欣赏!

NancyFx 2.0的开源框架的使用-Stateless的更多相关文章

  1. NancyFx 2.0的开源框架的使用-Stateless(二)

    继续上一篇Stateless的博文,在上一篇的博文的基础上稍微加点东西 接下来右键解决方案添加新项目,一样建一个空的Web项目 然后在StatelessDemoWeb项目里面添加Views文件夹,Sc ...

  2. NancyFx 2.0的开源框架的使用-Basic

    这是NancyFx开源框架中的Basic认证,学习一下! 首先当然是新建一个空的Web,BasicDemo 继续在项目中添加Nuget包,记得安装的Nuget包是最新的预发行版 Nancy Nancy ...

  3. NancyFx 2.0的开源框架的使用-CustomModule(自定义模块)

    NancyFx框架的自定义模块 新建一个空的Web项目 然后通过NuGet库安装下面的包 Nancy Nancy.Hosting.Aspnet 然后添加Models,Module,Views三个文件夹 ...

  4. NancyFx 2.0的开源框架的使用-ModelBinding(实现绑定)

    NancyFx框架中使用绑定模型 新建一个空的Web程序 然后安装Nuget库里面的包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Spark 并在We ...

  5. NancyFx 2.0的开源框架的使用-HosingOwin

    Nancy框架的Owin使用 先建一个空的Web项目 然后往Nuget库里面添加Nancy包 Nancy Nancy.Owin Nancy.ViewEnglines.Spark 然后添加Models, ...

  6. NancyFx 2.0的开源框架的使用-Authentication

    新建一个空的项目 新建好了空的项目以后,接着通过NuGet安装一下三个包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Razor 然后在项目中添加Mod ...

  7. NancyFx 2.0的开源框架的使用-Forms

    同样的像前面2篇博文一样,每个项目的开始基本都是建个空的Web项目 在NuGet库中安装以下几个NuGet包 Nancy Nancy.Authentication.Forms Nancy.Hostin ...

  8. NancyFx 2.0的开源框架的使用-AspnetBootstrapping

    新建一个空的Web项目AspnetBootstrappingDemo 然后添加NuGet组件 Nancy Nancy.Hosting.Aspnet Nancy.ViewEngines.Razor 继续 ...

  9. NancyFx 2.0的开源框架的使用-Caching

    新建一个空的Web项目,命名CachingDemo 然后添加三个Nuget安装包 Nancy Nancy.Hosting.Aspnet Nancy.ViewsEngines.Razor 然后往项目里面 ...

随机推荐

  1. 利用select实现伪并发的socket

    使用socket模块可以实现程序之间的通信,但是server在同一时刻只能和一个客户端进行通信,如果要实现一个server端可以和多个客户端进行通信可以使用 1.多线程 2.多进程 3.select ...

  2. Unity 3D Framework Designing(4)——设计可复用的SubView和SubViewModel(Part 2)

    在我们设计和开发应用程序时,经常要用到控件.比如开发一个客户端WinForm应用程序时,微软就为我们提供了若干控件,这些控件为我们提供了可被定制的属性和事件.属性可以更改它的外观,比如背景色,标题等, ...

  3. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 3

    formAdbRequest我们在之前已经分析过,做的事情就是组建好ADB协议的命令以待发送给ADB服务器,在我们558行中最终组建好的ADB协议命令将会如下: “host-serial:xxx:fo ...

  4. ksum问题

    2sum: Given an array of integers, return indices of the two numbers such that they add up to a speci ...

  5. .net mvc------下拉列表DropDownList控件------绑定数据

    下拉列表 以性别为例 绑定可以了,可以显示了,但有些地方就能传值,有些地方就会出错提示,如有大神请指教.... 错误如下: 具有键"sex"的 ViewData 项属于类型&quo ...

  6. MySQL学习笔记(三)—索引

    一.概述 1.基本概念       在大型数据库中,一张表中要容纳几万.几十万,甚至几百万的的数据,而当这些表与其他表连接后,所得到的新的数据数目更是要大大超出原来的表.当用户检索这么大量的数据时,经 ...

  7. css 画出三角形

    技术分享不一定行文累赘 这里说说最简洁的 css 画出三角形 display: inline-block; border: 10px dashed transparent; border-left: ...

  8. C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)

    下面来进行这段代码的分析: struct node {  //定义一个结构体node(节点)    int x;    int y;    int len;   //node中有3个成员变量x,y,l ...

  9. AJAX做增删改查详细!

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. CODEVS上一道很有趣的题(2145 判断奇偶性)

    判断函数y=x^n次方的奇偶性若是奇函数就输出ji,偶函数输出ou 233333 用到了long long 还是爆了,于是就上了char a[1000000] =.= #include<stdi ...