授权几乎是所以系统都不可或缺的部分,在Nancy中怎么授权呢?我们这篇博文来说一下Nancy的Forms授权。

首先在NuGet上安装Nancy.Authentication.Forms

Nancy的Forms验证得实现IUserMapper接口,用户类实现IUserIdentity接口(为了方便,我把DB的User,Model的User全合成一个User)

User.cs

using Nancy.Security;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace TestSelfHostWeb
{public class User : IUserIdentity{public User(){}public User(string userName){UserName = userName;}/// <summary>/// 实现接口的成员/// </summary>public string UserName{get;set;}public string Password{get;set;}public string Role{get;set;}/// <summary>/// 这个是Nancy授权中必须的/// </summary>public Guid GUID{get;set;}/// <summary>/// 实现接口的成员/// </summary>public IEnumerable<string> Claims{get;set;}}
}

UserMapper.cs

using Nancy.Authentication.Forms;
using System;
using System.Collections.Generic;
using System.Linq;
using Nancy;
using Nancy.Security;namespace TestSelfHostWeb
{class UserMapper : IUserMapper{//这个用户集合可以来自数据库static List<User> _users;static UserMapper(){//初始化验用户数据_users = new List<User>();_users.Add(new User() { UserName = "aaa", Password = "111111", GUID = new Guid("33e67c06-ed6e-4bd7-a5b0-60ee0fea890c"), Role = "admin" });_users.Add(new User() { UserName = "bbb", Password = "222222", GUID = new Guid("fba4be7d-25af-416e-a641-a33174f435d1"), Role = "user" });}/// <summary>/// 实现接口的成员,获取用户的角色,以便验证授权/// </summary>/// <param name="identifier"></param>/// <param name="context"></param>/// <returns></returns>public IUserIdentity GetUserFromIdentifier(Guid identifier, NancyContext context){var user = _users.FirstOrDefault(u => u.GUID == identifier);return user == null? null: new User(user.UserName) { Claims = new string[] { user.Role } };}/// <summary>/// 验证用户,验证成功返回用户的GUID,这是规定/// </summary>/// <param name="userName"></param>/// <param name="password"></param>/// <returns></returns>public static Guid? ValidateUser(string userName, string password){var user = _users.FirstOrDefault(u => u.UserName == userName && u.Password == password);if (user == null){return null;}return user.GUID;}}
}

Bootstrapper.cs

using Nancy;
using Nancy.Bootstrapper;
using Nancy.TinyIoc;
using Nancy.Authentication.Forms;namespace TestSelfHostWeb
{public class Bootstrapper : DefaultNancyBootstrapper{protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context){base.RequestStartup(container, pipelines, context);//验证配置文件var formsAuthConfiguration = new FormsAuthenticationConfiguration(){RedirectUrl = "~/login",//无验证跳转的路由UserMapper = container.Resolve<IUserMapper>()//用户对应的Mapper};//开启验证FormsAuthentication.Enable(pipelines, formsAuthConfiguration);}}
}

Login.cs

using Nancy;
using Nancy.Authentication.Forms;
using Nancy.ModelBinding;
using System;namespace TestSelfHostWeb.Modules
{public class LoginModule : NancyModule{public LoginModule(){Get["/login"] = parameters =>{//用户名和密码验证失败的标识ViewBag["error"] = Request.Query.error;return View["login"];};Post["/login"] = parameters =>{var user = this.Bind<User>();var guid= UserMapper.ValidateUser(user.UserName, user.Password);if (guid == null){//按用户名密码查询不到时作的标识return this.LogoutAndRedirect("~/login?error=true");}DateTime? expiry = null;//登录后跳转页面,必需用户的GUIDreturn this.LoginAndRedirect(guid.Value, expiry);};}}
}

login.cshtml

@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<TestSelfHostWeb.User>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8" /><title>Login</title><style type="text/css">body {text-align: center;}</style>
</head>
<body><form action="\Login" method="post">UserName:<input id="UserName" name="UserName" type="text" />Password:<input id="Password" name="Password" type="password" /><input type="submit" value="Login" />@if (ViewBag["error"]){<font color="red">check username or password please</font>}</form>
</body>
</html>

Index.cs

using Nancy;
using Nancy.Security;namespace TestSelfHostWeb.Modules
{public class IndexModule : NancyModule{public IndexModule(){//开启全局验证this.RequiresAuthentication();Get["/"] = parameters =>{//开启角色验证,只有该角色可以访问本路由this.RequiresClaims("admin");return View["index"];};}}
}

Index.cshtml同上篇的indexx.cshtml

到了test的时刻了

启动host(注意以管理员身份运行)

访问网站的主页,如下图,会跳转到登记页,这是因为index.cs的IndexModule中开启了this.RequiresAuthentication()验证,为什么会跳转到login路由中呢,是因为Bootstrapper中formAuthConfiguration中的RedirectUrl设置。

如果用户名或密码错误 ,会得到提示:

如果用户名密码正确:

如果不具备权限的人(UserName:bbb,Passowrd:222222)登录,会报403错误(这个不太友下,下篇博客解决)

这样就能轻量级的按解色来授权我们的系统了。

Nancy之Forms验证相关推荐

  1. Asp.net中基于Forms验证的角色验证授权[转]

    Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活. Forms 验证方式对基于用户的验证授 ...

  2. 浅谈ASP.NET Forms验证

    ASP.NET Forms验证 用户验证是每一个项目必须的一个模块,由于已经很久没有碰到这一块内容,今天写一个用户验证居然脑子一片空白.于是乎就和一个同事进行了一片讨论,晚上回家决定把讨论的结果给记录 ...

  3. 在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态

    原文:http://caomao.cnblogs.com/archive/2005/07/05/186606.html 今天一早看了dudu关于二级域名Cookie的问题及解决方法,认为dudu的原理 ...

  4. MVC Controllers和Forms验证

    想想下,一组从Forms验证抽象出来的登入/登出Controllers行为特有的ActionResult实现.. 我已经使用ASP.NETMVC重新实现了我的个人网站(projects.nikhilk ...

  5. 【转载】Asp.Net中基于Forms验证的角色验证授权

    Asp.Net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活. Forms 验证方式对基于用户的验证授 ...

  6. SharePoint2007 配置MOSS基于AD的Forms验证

    公司上边要求使用Forms验证方式登陆到MOSS系统 于是经过研究测试成功了, 这次上边又要求用户必须为AD用户 查了很多资料 经过了一番周折 终于测试成功了,无奈网上文章转载的太多, 差错太多,特将 ...

  7. 当ASP.NET Forms验证方式遭遇苹果IOS

    一.问题出现 我在用ASP.NET MVC4做微信开发的时候,用Forms验证方式做为authentication. 一般都是在web.config加: <authentication mode ...

  8. ASP.NET Forms验证 实现子域名(SubDomain)共享登陆下的缺陷 [转]

    一.什么是单点登录 单点登录就是在多个web应用程序中,实现统一登录方式,一但登录了某web应用程序,其它相关联的web应用程 序都无需再次登录,一个地方退出,所有相关联的web应用程序都退出. 二. ...

  9. 2004-11-3 + 扩展Forms验证

    1.使用Forms验证存储用户自定义信息 Forms验证在内部的机制为把用户数据加密后保存在一个基于cookie的票据FormsAuthenticationTicket中,因为是经过特殊加密的,所以应 ...

最新文章

  1. OC基本数据存储方式
  2. ubuntu下和开发板下播放音乐
  3. 由中行IBM大型机宕机谈银行系统运维
  4. Restlet框架– Hello World示例
  5. HDS:聚焦未来的投资“冻结”
  6. 安装sendmail
  7. 关于delete字符串 需不需要加 [ ]
  8. 很多创业者总是说融资难
  9. [转载] python自定义异常类型和raise抛出异常
  10. 【渝粤教育】电大中专消费者行为学 (2)作业 题库
  11. python解压7z文件_如何读取用7z压缩的文本文件?
  12. AUTOCAD——快速提取边界线、CAD绘制单双开门
  13. Ubuntu14.04 64位网易云播放器
  14. 提高复杂网络分析效率!中国科学家研发强化学习新框架
  15. 明星热图|巩俐接新代言;李宇春、宋威龙、王一博、丁禹兮、黄渤等参加品牌活动...
  16. 浑天码部件代码表说明
  17. cvm服务器虚拟机,macOS CVM服务器漏洞曝光
  18. element-ui的输入框只能输入数字
  19. 台达c语言,台达PL C通信协议ModbusASCII(DVP).pdf
  20. win10在线安装Visual Studio2017

热门文章

  1. AnimalTFDB 3.0:动物转录因子注释和预测的综合资源库
  2. python数据挖掘资料
  3. python代码编写规范有哪些_Python代码编写规范(适合于小团体,低强度)
  4. 光流 | 金字塔迭代(Iterative Pyramidal)LK光流算法(Matlab源代码)
  5. mysql数据万能导入工具下载_mysql数据导入工具下载 - 数据导入工具(EMS Data Export for MySQL) v3.7.0多语特别版下载 - 第九软件网...
  6. html二级导航栏随一级居中,html – 1.在css中链接不起作用2.如何垂直居中导航栏并在每个导航栏上添加填充...
  7. PyQt5 笔记6 -- 对话框(QDialog)
  8. Scikit-Learn 机器学习笔记 -- 模型训练
  9. tensorflow随笔-读文件
  10. 【机器学习】机器学习必知概念