博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nancy之Forms验证
阅读量:6654 次
发布时间:2019-06-25

本文共 5481 字,大约阅读时间需要 18 分钟。

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

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

NancyForms验证得实现IUserMapper接口,用户类实现IUserIdentity接口(为了方便,我把DBUserModelUser全合成一个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;        }        ///         /// 实现接口的成员        ///         public string UserName        {            get;            set;        }         public string Password        {            get;            set;        }         public string Role        {            get;            set;        }        ///         /// 这个是Nancy授权中必须的        ///         public Guid GUID        {            get;            set;        }        ///         /// 实现接口的成员        ///         public IEnumerable
 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
 _users;        static UserMapper()        {            //初始化验用户数据            _users = new List
();            _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" });        }        /// 
        /// 实现接口的成员,获取用户的角色,以便验证授权        ///         /// 
        /// 
        /// 
        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 } };        }        /// 
        /// 验证用户,验证成功返回用户的GUID,这是规定        ///         /// 
        /// 
        /// 
        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
()//用户对应的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
();                  var guid= UserMapper.ValidateUser(user.UserName, user.Password);                   if (guid == null)                  {                      //按用户名密码查询不到时作的标识                      return this.LogoutAndRedirect("~/login?error=true");                  }                  DateTime? expiry = null;                  //登录后跳转页面,必需用户的GUID                  return this.LoginAndRedirect(guid.Value, expiry);                               };        }    }}

login.cshtml

@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase
    
    
Login    
        body {            text-align: center;        }        
        UserName:
        Password:
        
        @if (ViewBag["error"])        {            
check username or password please        }    

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.csIndexModule中开启了this.RequiresAuthentication()验证,为什么会跳转到login路由中呢,是因为BootstrapperformAuthConfiguration中的RedirectUrl设置。

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

如果用户名密码正确:

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

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

转载地址:http://wftto.baihongyu.com/

你可能感兴趣的文章
Python 面向对象编程指南 读书笔记
查看>>
iOS股票K线图、校园助手、适配iPhone X、版本检测等源码
查看>>
Spring Cloud Bus整合Kafka
查看>>
MongoDB Atlas 新特性:更多跨区域复制集节点的支持
查看>>
Java集合源码分析系列-(一)ArrayList源码剖析
查看>>
java 关键字总结
查看>>
Zsh 开发指南(第十三篇 管道和重定向)
查看>>
Cumulo Editor 启动教程
查看>>
SegmentFault 专访 Typecho 发起人:Joyqi
查看>>
【工具】lnmp一键脚本
查看>>
二叉树的基本运算
查看>>
maven的使用
查看>>
《HTTP权威指南》学习-缓存
查看>>
Micro 架构与设计
查看>>
Lua Table 长度的计算
查看>>
iView 发布 2.0.0-rc.15 版本
查看>>
PHP 基于laravel框架获取微博数据之二 用户数据的使用
查看>>
Visual Studio 2017最新版正式发布!适用于任何开发人员、平台及APP
查看>>
Spotify开源其Cassandra编排工具cstar
查看>>
历史上代价最高的11个软件故障
查看>>