同样和前面一样新建一个空的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. JavaEE开发之Spring中Bean的作用域、Init和Destroy方法以及Spring-EL表达式

    上篇博客我们聊了<JavaEE开发之Spring中的依赖注入以及AOP>,本篇博客我们就来聊一下Spring框架中的Bean的作用域以及Bean的Init和Destroy方法,然后在聊一下 ...

  2. Servlet3.0新特性使用详解

    可插拔的Web框架 几乎所有基于Java的web框架都建立在servlet之上.现今大多数web框架要么通过servlet.要么通过Web.xml插入.利用标注(Annotation)来定义servl ...

  3. CSS3学习笔记(4)-CSS3函数

    p{ font-size: 15px; text-indent: 2em; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid ...

  4. 性能测试分享:MYSQL死锁

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  5. 关于for()循环使用过程中遇到的问题(俄罗斯方块游戏中遇到的问题)

    for循环的定义: for(参数1:参数2:参数3),参数1通常是初始化参数的,参数2是判断,参数3是对参数的操作.这三个参数都不是必须的. 这里想说的是,参数1的使用:比如下列语 int nLine ...

  6. JS数组根据属性来实现排序

    var data = [{ name: "zhao", age: }, { name: "qian", age: }, { name: "sun&qu ...

  7. 详细了解 int? 类型

    一.int?是什么 二.了解Nullable结构体 三.Nullable类型的取值与转换 1.GetValueOrDefault 2.运算符重载 一.int?是什么 说到int?,或者double?, ...

  8. ios 获取当前设备信息、内存

    //在[UIDevice currentDevice]中的属性 @property(nonatomic,readonly,strong) NSString *name; // e.g. "M ...

  9. C++小技巧之CONTAINING_RECORD

    CONTAINING_RECORD Containing record是一个在C++编程中用处很大的一种技巧,它的功能为已知结构体或类的某一成员.对象中该成员的地址以及这一结构体名或类名,从而得到该对 ...

  10. WPF中button按钮同时点击多次触发click解决方法

    DateTime lastClick = DateTime.Now; object obj = new object(); ; private void Button_Click(object sen ...