NancyFx 2.0的开源框架的使用-Stateless
同样和前面一样新建一个空的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的更多相关文章
- NancyFx 2.0的开源框架的使用-Stateless(二)
继续上一篇Stateless的博文,在上一篇的博文的基础上稍微加点东西 接下来右键解决方案添加新项目,一样建一个空的Web项目 然后在StatelessDemoWeb项目里面添加Views文件夹,Sc ...
- NancyFx 2.0的开源框架的使用-Basic
这是NancyFx开源框架中的Basic认证,学习一下! 首先当然是新建一个空的Web,BasicDemo 继续在项目中添加Nuget包,记得安装的Nuget包是最新的预发行版 Nancy Nancy ...
- NancyFx 2.0的开源框架的使用-CustomModule(自定义模块)
NancyFx框架的自定义模块 新建一个空的Web项目 然后通过NuGet库安装下面的包 Nancy Nancy.Hosting.Aspnet 然后添加Models,Module,Views三个文件夹 ...
- NancyFx 2.0的开源框架的使用-ModelBinding(实现绑定)
NancyFx框架中使用绑定模型 新建一个空的Web程序 然后安装Nuget库里面的包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Spark 并在We ...
- NancyFx 2.0的开源框架的使用-HosingOwin
Nancy框架的Owin使用 先建一个空的Web项目 然后往Nuget库里面添加Nancy包 Nancy Nancy.Owin Nancy.ViewEnglines.Spark 然后添加Models, ...
- NancyFx 2.0的开源框架的使用-Authentication
新建一个空的项目 新建好了空的项目以后,接着通过NuGet安装一下三个包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Razor 然后在项目中添加Mod ...
- NancyFx 2.0的开源框架的使用-Forms
同样的像前面2篇博文一样,每个项目的开始基本都是建个空的Web项目 在NuGet库中安装以下几个NuGet包 Nancy Nancy.Authentication.Forms Nancy.Hostin ...
- NancyFx 2.0的开源框架的使用-AspnetBootstrapping
新建一个空的Web项目AspnetBootstrappingDemo 然后添加NuGet组件 Nancy Nancy.Hosting.Aspnet Nancy.ViewEngines.Razor 继续 ...
- NancyFx 2.0的开源框架的使用-Caching
新建一个空的Web项目,命名CachingDemo 然后添加三个Nuget安装包 Nancy Nancy.Hosting.Aspnet Nancy.ViewsEngines.Razor 然后往项目里面 ...
随机推荐
- [AndroidTips]startService与bindService的区别
Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的. ...
- 2.4G无线收发模块/射频RFM75调试总结/RF知识整理
射频RFM75通信是收发双方都需要编程的器件,收发双方的通道频率,空中传输速率设置一致,调试时必须先调通一块再调另一块,否则出现问题了就不知道是发送端有问题还是接收端有问题.调试必须理清思路.正确的方 ...
- 共通css初次尝试
1.网页的主要的html <@fn.html css=["${basePath}/css/help/guideCommon.css${versionControl}"]tit ...
- 使用Python对Access读写操作
学习Python的过程中,我们会遇到Access的读写问题,这时我们可以利用win32.client模块的COM组件访问功能,通过ADODB操作Access的文件. 1.导入模块 import win ...
- 学习smart gwt 的一些好的网站
最近在学smart gwt,这个框架和我们比较熟悉的SSH实现思路上有点不一样,因为技术是外国的,所以好多东西都是英文的,正因为是英文的,我们学到的东西才是最多最好的,好了,网站如下: gwt api ...
- 统计web应用程序的访问人数
新建一个空网站,添加Global.asax全局处理. 文件目录如图: 在global类中添加代码: using System; using System.Collections.Generic; us ...
- C#调用WebService接口实现天气预报在web前端显示
本文使用web (C#)调用互联网上公开的WebServices接口: (http://www.webxml.com.cn/WebServices/WeatherWebService.asmx)来实现 ...
- Bug 笔记
1.页面返回 400 Bag request: 原因:使用Spring MVC controller的时候,查询数据库:当数据库的数据类型是int型时,Spring MVC在查询的数据匹配给实体类 ...
- chrome浏览器tab页内存占用变大,网站变慢为哪般?
问题概述: 公司做的是BS应用. 之前我们的后台服务器程序是带状态的,用ehcache存储登录状态:这两天被我改成了redis存储,应用本身不再存储登录状态. 然后自测,我在测试某个很耗时间的网页操作 ...
- iptables配置详解
iptables主要参数 -A 向规则链中添加一条规则,默认被添加到末尾 -T指定要操作的表,默认是filter -D从规则链中删除规则,可以指定序号或者匹配的规则来删除 -R进行规则替换 -I插入一 ...