搜索
首页web前端html教程Nancy之Forms authentication的简单使用_html/css_WEB-ITnose

一、前言

想必大家或多或少都听过微软推出的ASP.NET Identity技术,可以简单的认为就是一种授权的实现

很巧的是,Nancy中也有与之相类似的技术Authentication, 这两者之间都用到了一些相通的安全技术

(我没有去看ASP.NET Identity的内部实现,是从它的简单用法中判断的)

正式开始介绍之前先推荐几篇ASP.NET Identity的好文章

r01cn 的  ASP.NET Identity系列教程(目录)

腾飞(Jesse)的  MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

好了,下面还是用demo的形式来介绍怎么简单使用Forms authentication吧

二、简单使用

1)、新建一个空的asp.net项目

2)、通过NuGet安装相应的包

1       Install-Package Nancy2      Install-Package Nancy.Hosting.Aspnet3       Install-Package Nancy.Authentication.Forms4       Install-Package Dapper

由于用到了数据库访问,所以还安装了Dapper

3)、建立数据表

 1 CREATE TABLE [dbo].[SystemUser]( 2     [SystemUserId] [uniqueidentifier] NOT NULL, 3     [SystemUserName] [nvarchar](50) NOT NULL, 4     [SystemUserPassword] [nvarchar](50) NOT NULL, 5  CONSTRAINT [PK_SystemUser] PRIMARY KEY CLUSTERED  6 ( 7     [SystemUserId] ASC 8 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 9 ) ON [PRIMARY]10 GO

同时像表中插入两条数据

1 INSERT INTO [dbo].[SystemUser]([SystemUserId],[SystemUserName],[SystemUserPassword])2 VALUES(newid(),'catcher','123')3 INSERT INTO [dbo].[SystemUser]([SystemUserId],[SystemUserName],[SystemUserPassword])4 VALUES(newid(),'admin','123')

注:由于是演示,所以密码没有进行加密处理

4)、建立相应的文件夹

Models用于存放模型

Modules用于存放相应的操作

Views用于存放视图

5)、编写模型 SystemUser.cs

1     public class SystemUser2     {3         public Guid SystemUserId { get; set; }4         public string SystemUserName { get; set; }5         public string SystemUserPassword { get; set; }6     }   

6)、编写HomeModule.cs

 1 using Dapper; 2 using Nancy; 3 using Nancy.Authentication.Forms; 4 using Nancy.ModelBinding; 5 using NancyDemoForFormsauthentication.Models; 6 using System.Data; 7 using System.Data.SqlClient; 8 using System.Linq; 9 namespace NancyDemoForFormsauthentication.Modules10 {11     public class HomeModule : NancyModule12     {13         public HomeModule()14         {15             Get["/"] = _ =>16             {17                 return View["index"];18             };19             Get["/login"] = _ =>20             {21                 return View["login"];22             };23             Post["/login"] = _ =>24             {25                 var loginUser = this.Bind<SystemUser>();26                 SystemUser user = GetValidUser(loginUser.SystemUserName, loginUser.SystemUserPassword);27                 if (user == null)28                 {29                     return Response.AsText("出错了", "text/html;charset=UTF-8");30                 }31                 return this.LoginAndRedirect(user.SystemUserId, fallbackRedirectUrl: "/secure");32             };33         }34         private readonly string sqlconnection =35                "Data Source=127.0.0.1;Initial Catalog=NancyDemo;User Id=sa;Password=dream_time1314;";36         private SqlConnection OpenConnection()37         {38             SqlConnection connection = new SqlConnection(sqlconnection);39             connection.Open();40             return connection;41         }42         private SystemUser GetValidUser(string name, string pwd)43         {44             using (IDbConnection conn = OpenConnection())45             {46                 const string query = "select * from SystemUser where SystemUserName=@SystemUserName and SystemUserPassword=@SystemUserPassword";47                 return conn.Query<SystemUser>(query, new { SystemUserName = name, SystemUserPassword = pwd }).SingleOrDefault();48             }49         }50     }51 }  

其中,登录的post方法中用到了 LoginAndRedirect 这个静态方法

这个方法位于ModuleExtensions.cs中,返回值是Response类型的

1         public static Response LoginAndRedirect(this INancyModule module, Guid userIdentifier, DateTime? cookieExpiry = null, string fallbackRedirectUrl = "/")2         {3             return FormsAuthentication.UserLoggedInRedirectResponse(module.Context, userIdentifier, cookieExpiry, fallbackRedirectUrl);4         }

看方法名都能知道这个是用来干什么的!

还有Response.AsText后面的第二个参数可以让中文不乱码!!

7)、编写相应的视图

index.html

 1 <!DOCTYPE html> 2 <html> 3 <head> 4     <title></title> 5     <meta charset="utf-8" /> 6 </head> 7 <body> 8     <h2 id="Nancy之基于Forms-authentication的简单使用">Nancy之基于Forms authentication的简单使用</h2> 9     <p>访问需要权限的页面</p>10     <a href="/secure">secure</a>11 </body>12 </html>

login.html

 1 <!DOCTYPE html> 2 <html> 3 <head> 4     <title></title> 5     <meta charset="utf-8" /> 6 </head> 7 <body> 8     <form method="post" action="/login"> 9         <label>姓名:</label><input type="text" name="SystemUserName" /><br />10         <label>密码:</label><input type="password" name="SystemUserPassword" /><br />11         <input type="submit" />12     </form>13 </body>14 </html>

8)、编写SecureModule.cs

 1 using Nancy; 2 using Nancy.Security; 3  4 namespace NancyDemoForFormsauthentication.Modules 5 { 6     public class SecureModule : NancyModule 7     { 8         public SecureModule() 9         {10             this.RequiresAuthentication();11             Get["/secure"] = _ =>12             {13                 return "Hello ," + this.Context.CurrentUser.UserName;14             };15         }16     }17 }  

其中

1 this.RequiresAuthentication();

这句是关键!!表明需要验证才能通过。位于Nancy.Security这个命名空间

通过验证访问后会打印出当前的用户名称。

9)、编写Bootstraper.cs

 1 using Nancy; 2 using Nancy.Authentication.Forms; 3 using Nancy.TinyIoc; 4 using Nancy.Bootstrapper; 5 namespace NancyDemoForFormsauthentication 6 { 7     public class Bootstrapper : DefaultNancyBootstrapper 8     { 9         protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context)10         {11             base.ConfigureRequestContainer(container, context);12             container.Register<IUserMapper, UserMapper>();13         }14         protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context)15         {16             base.RequestStartup(container, pipelines, context);17             var formsAuthConfiguration = new FormsAuthenticationConfiguration18             {19                 RedirectUrl = "~/login",20                 UserMapper = container.Resolve<IUserMapper>(),21             };22             FormsAuthentication.Enable(pipelines, formsAuthConfiguration);23         }24     }25 }  

这里是至关重要的一步!!!

要在RequestStartup中启用我们的FormsAuthentication!!

同时我们还要配置FormsAuthenticationConfiguration

注册了UserMapper,所以我们接下来就是实现UserMapper

10)、编写UserMapper.cs

 1 using Dapper; 2 using Nancy; 3 using Nancy.Authentication.Forms; 4 using Nancy.Security; 5 using NancyDemoForFormsauthentication.Models; 6 using System; 7 using System.Data; 8 using System.Data.SqlClient; 9 using System.Linq;10 namespace NancyDemoForFormsauthentication11 {12     public class UserMapper : IUserMapper13     {14         public IUserIdentity GetUserFromIdentifier(Guid identifier, NancyContext context)15         {16             using (IDbConnection conn = OpenConnection())17             {18                 const string query = "select * from SystemUser where SystemUserId=@SystemUserId";19                 var user = conn.Query<SystemUser>(query, new { SystemUserId = identifier }).SingleOrDefault();20                 if (user == null)21                 {22                     return null;23                 }24                 else25                 {26                     return new UserIdentity27                     {28                         UserName = user.SystemUserName,29                         Claims = new[] { "SystemUser"}30                     };31                 }32             }33         }34         private readonly string sqlconnection =35                 "Data Source=127.0.0.1;Initial Catalog=NancyDemo;User Id=sa;Password=dream_time1314;";36         private SqlConnection OpenConnection()37         {38             SqlConnection connection = new SqlConnection(sqlconnection);39             connection.Open();40             return connection;41         }42     }43 }  

UserMapper必须要实现IUserMapper这个接口!同时返回一个实现IUserIdentity接口的对象。

11)、编写UserIdentity.cs

 1 using Nancy.Security; 2 using System.Collections.Generic; 3 namespace NancyDemoForFormsauthentication 4 { 5     public class UserIdentity : IUserIdentity 6     { 7         public string UserName { get; set; } 8         public IEnumerable<string> Claims { get; set; } 9     }10 }  

到这里所有的工作都已经做完了,下面就是看看效果了

我们点击 secure链接,发现自动跳转到登录界面了!!

我们输入用户名和密码

登录成功,并返回到secure页面了!

当我们输入错误的用户名和密码时

最后是本次示例代码:

https://github.com/hwqdt/Demos/tree/master/src/NancyDemoForFormsauthentication

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
HTML和代码:仔细观察术语HTML和代码:仔细观察术语Apr 10, 2025 am 09:28 AM

htmlisaspecifictypefodyfocusedonstructuringwebcontent,而“代码” badlyLyCludEslanguagesLikeLikejavascriptandPytyPythonForFunctionality.1)htmldefineswebpagertuctureduseTags.2)“代码”代码“ code” code code code codeSpassSesseseseseseseseAwiderRangeLangeLangeforLageforLogageforLogicIctInterract

HTML,CSS和JavaScript:Web开发人员的基本工具HTML,CSS和JavaScript:Web开发人员的基本工具Apr 09, 2025 am 12:12 AM

HTML、CSS和JavaScript是Web开发的三大支柱。1.HTML定义网页结构,使用标签如、等。2.CSS控制网页样式,使用选择器和属性如color、font-size等。3.JavaScript实现动态效果和交互,通过事件监听和DOM操作。

HTML,CSS和JavaScript的角色:核心职责HTML,CSS和JavaScript的角色:核心职责Apr 08, 2025 pm 07:05 PM

HTML定义网页结构,CSS负责样式和布局,JavaScript赋予动态交互。三者在网页开发中各司其职,共同构建丰富多彩的网站。

HTML容易为初学者学习吗?HTML容易为初学者学习吗?Apr 07, 2025 am 12:11 AM

HTML适合初学者学习,因为它简单易学且能快速看到成果。1)HTML的学习曲线平缓,易于上手。2)只需掌握基本标签即可开始创建网页。3)灵活性高,可与CSS和JavaScript结合使用。4)丰富的学习资源和现代工具支持学习过程。

HTML中起始标签的示例是什么?HTML中起始标签的示例是什么?Apr 06, 2025 am 12:04 AM

AnexampleOfAstartingTaginHtmlis,beginSaparagraph.startingTagSareEssentialInhtmlastheyInitiateEllements,defiteTheeTheErtypes,andarecrucialforsstructuringwebpages wepages webpages andConstructingthedom。

如何利用CSS的Flexbox布局实现菜单中虚线分割效果的居中对齐?如何利用CSS的Flexbox布局实现菜单中虚线分割效果的居中对齐?Apr 05, 2025 pm 01:24 PM

如何设计菜单中的虚线分割效果?在设计菜单时,菜名和价格的左右对齐通常不难实现,但中间的虚线或点如何...

在线代码编辑器究竟用什么HTML元素实现代码输入?在线代码编辑器究竟用什么HTML元素实现代码输入?Apr 05, 2025 pm 01:21 PM

网页代码编辑器中的HTML元素分析许多在线代码编辑器允许用户输入HTML、CSS和JavaScript代码。最近,有人提出了一...

React静态页面构建:如何用react-app-rewired避免代码压缩?React静态页面构建:如何用react-app-rewired避免代码压缩?Apr 05, 2025 pm 01:18 PM

关于使用react-app-rewired构建静态页面时如何避免代码压缩许多开发者在使用React构建静态页面时,希望在交付给�...

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器