Nancy之Forms authentication的简单使用
一、前言
想必大家或多或少都听过微软推出的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安装相应的包
Install-Package Nancy
Install-Package Nancy.Hosting.Aspnet
Install-Package Nancy.Authentication.Forms
Install-Package Dapper
由于用到了数据库访问,所以还安装了Dapper
3)、建立数据表
CREATE TABLE [dbo].[SystemUser](
[SystemUserId] [uniqueidentifier] NOT NULL,
[SystemUserName] [nvarchar](50) NOT NULL,
[SystemUserPassword] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_SystemUser] PRIMARY KEY CLUSTERED
(
[SystemUserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
同时像表中插入两条数据
INSERT INTO [dbo].[SystemUser]([SystemUserId],[SystemUserName],[SystemUserPassword])
VALUES(newid(),'catcher','')
INSERT INTO [dbo].[SystemUser]([SystemUserId],[SystemUserName],[SystemUserPassword])
VALUES(newid(),'admin','')
注:由于是演示,所以密码没有进行加密处理
4)、建立相应的文件夹
Models用于存放模型
Modules用于存放相应的操作
Views用于存放视图
5)、编写模型 SystemUser.cs
public class SystemUser
{
public Guid SystemUserId { get; set; }
public string SystemUserName { get; set; }
public string SystemUserPassword { get; set; }
}
6)、编写HomeModule.cs
using Dapper;
using Nancy;
using Nancy.Authentication.Forms;
using Nancy.ModelBinding;
using NancyDemoForFormsauthentication.Models;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
namespace NancyDemoForFormsauthentication.Modules
{
public class HomeModule : NancyModule
{
public HomeModule()
{
Get["/"] = _ =>
{
return View["index"];
};
Get["/login"] = _ =>
{
return View["login"];
};
Post["/login"] = _ =>
{
var loginUser = this.Bind<SystemUser>();
SystemUser user = GetValidUser(loginUser.SystemUserName, loginUser.SystemUserPassword);
if (user == null)
{
return Response.AsText("出错了", "text/html;charset=UTF-8");
}
return this.LoginAndRedirect(user.SystemUserId, fallbackRedirectUrl: "/secure");
};
}
private readonly string sqlconnection =
"Data Source=127.0.0.1;Initial Catalog=NancyDemo;User Id=sa;Password=dream_time1314;";
private SqlConnection OpenConnection()
{
SqlConnection connection = new SqlConnection(sqlconnection);
connection.Open();
return connection;
}
private SystemUser GetValidUser(string name, string pwd)
{
using (IDbConnection conn = OpenConnection())
{
const string query = "select * from SystemUser where SystemUserName=@SystemUserName and SystemUserPassword=@SystemUserPassword";
return conn.Query<SystemUser>(query, new { SystemUserName = name, SystemUserPassword = pwd }).SingleOrDefault();
}
}
}
}
其中,登录的post方法中用到了 LoginAndRedirect 这个静态方法
这个方法位于ModuleExtensions.cs中,返回值是Response类型的
public static Response LoginAndRedirect(this INancyModule module, Guid userIdentifier, DateTime? cookieExpiry = null, string fallbackRedirectUrl = "/")
{
return FormsAuthentication.UserLoggedInRedirectResponse(module.Context, userIdentifier, cookieExpiry, fallbackRedirectUrl);
}
看方法名都能知道这个是用来干什么的!
还有Response.AsText后面的第二个参数可以让中文不乱码!!
7)、编写相应的视图
index.html
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
</head>
<body>
<h2>Nancy之基于Forms authentication的简单使用</h2>
<p>访问需要权限的页面</p>
<a href="/secure">secure</a>
</body>
</html>
login.html
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
</head>
<body>
<form method="post" action="/login">
<label>姓名:</label><input type="text" name="SystemUserName" /><br />
<label>密码:</label><input type="password" name="SystemUserPassword" /><br />
<input type="submit" />
</form>
</body>
</html>
8)、编写SecureModule.cs
using Nancy;
using Nancy.Security; namespace NancyDemoForFormsauthentication.Modules
{
public class SecureModule : NancyModule
{
public SecureModule()
{
this.RequiresAuthentication();
Get["/secure"] = _ =>
{
return "Hello ," + this.Context.CurrentUser.UserName;
};
}
}
}
其中
this.RequiresAuthentication();
这句是关键!!表明需要验证才能通过。位于Nancy.Security这个命名空间
通过验证访问后会打印出当前的用户名称。
9)、编写Bootstraper.cs
using Nancy;
using Nancy.Authentication.Forms;
using Nancy.TinyIoc;
using Nancy.Bootstrapper;
namespace NancyDemoForFormsauthentication
{
public class Bootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context)
{
base.ConfigureRequestContainer(container, context);
container.Register<IUserMapper, UserMapper>();
}
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>(),
};
FormsAuthentication.Enable(pipelines, formsAuthConfiguration);
}
}
}
这里是至关重要的一步!!!
要在RequestStartup中启用我们的FormsAuthentication!!
同时我们还要配置FormsAuthenticationConfiguration
注册了UserMapper,所以我们接下来就是实现UserMapper
10)、编写UserMapper.cs
using Dapper;
using Nancy;
using Nancy.Authentication.Forms;
using Nancy.Security;
using NancyDemoForFormsauthentication.Models;
using System;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
namespace NancyDemoForFormsauthentication
{
public class UserMapper : IUserMapper
{
public IUserIdentity GetUserFromIdentifier(Guid identifier, NancyContext context)
{
using (IDbConnection conn = OpenConnection())
{
const string query = "select * from SystemUser where SystemUserId=@SystemUserId";
var user = conn.Query<SystemUser>(query, new { SystemUserId = identifier }).SingleOrDefault();
if (user == null)
{
return null;
}
else
{
return new UserIdentity
{
UserName = user.SystemUserName,
Claims = new[] { "SystemUser"}
};
}
}
}
private readonly string sqlconnection =
"Data Source=127.0.0.1;Initial Catalog=NancyDemo;User Id=sa;Password=dream_time1314;";
private SqlConnection OpenConnection()
{
SqlConnection connection = new SqlConnection(sqlconnection);
connection.Open();
return connection;
}
}
}
UserMapper必须要实现IUserMapper这个接口!同时返回一个实现IUserIdentity接口的对象。
11)、编写UserIdentity.cs
using Nancy.Security;
using System.Collections.Generic;
namespace NancyDemoForFormsauthentication
{
public class UserIdentity : IUserIdentity
{
public string UserName { get; set; }
public IEnumerable<string> Claims { get; set; }
}
}
到这里所有的工作都已经做完了,下面就是看看效果了
我们点击 secure链接,发现自动跳转到登录界面了!!
我们输入用户名和密码
登录成功,并返回到secure页面了!
当我们输入错误的用户名和密码时
最后是本次示例代码:
https://github.com/hwqdt/Demos/tree/master/src/NancyDemoForFormsauthentication
Nancy之Forms authentication的简单使用的更多相关文章
- Nancy 学习-身份认证(Forms authentication) 继续跨平台
开源 示例代码:https://github.com/linezero/NancyDemo 上篇讲解Nancy的Basic Authentication,现在来学习Nancy 的Forms身份认证. ...
- ASP.NET 4.0 forms authentication issues with IE11
As I mentioned earlier, solutions that rely on User-Agent sniffing may break, when a new browser or ...
- Forms Authentication in ASP.NET MVC 4
原文:Forms Authentication in ASP.NET MVC 4 Contents: Introduction Implement a custom membership provid ...
- Forms Authentication and Role based Authorization: A Quicker, Simpler, and Correct Approach
https://www.codeproject.com/Articles/36836/Forms-Authentication-and-Role-based-Authorization Problem ...
- An Overview of Forms Authentication (C#)
https://docs.microsoft.com/en-us/aspnet/web-forms/overview/older-versions-security/introduction/an-o ...
- .net core 共享 .Net Forms Authentication cookie
Asp.net 项目迁移到 asp.net core 项目后需要 兼容以前老的项目的登录方式. Forms Authentication cookie 登录. 从网上搜集到关于这个问题的解决思路都没有 ...
- ASP.NET Session and Forms Authentication and Session Fixation
https://peterwong.net/blog/asp-net-session-and-forms-authentication/ The title can be misleading, be ...
- Forms authentication timeout vs sessionState timeout
https://stackoverflow.com/questions/17812994/forms-authentication-timeout-vs-sessionstate-timeout Th ...
- SSRS 2016 Forms Authentication
SSRS 2016 comes with completely new report manager web interface and implementing form authenticatio ...
随机推荐
- ASP.NET Core 数据保护(Data Protection)【上】
前言 上一篇博客记录了如何在 Kestrel 中使用 HTTPS(SSL), 也是我们目前项目中实际使用到的. 数据安全往往是开发人员很容易忽略的一个部分,包括我自己.近两年业内也出现了很多因为安全问 ...
- Centos7下安装mono3.10.0
mono 3.10.0 正式发布:性能进一步改进,以前已经写过一篇 Centos 7.0 安装Mono 3.4 和Jexus 5.6.下面我们在CentOS 7上通过源码安装Mono 3.10, 需 ...
- 每周一书-《鸟哥的Linux私房菜》获奖公布
<鸟哥的Linux私房菜>一书的赠书活动时间为2016年10月19日到10月31日, 也就是今天结束. 首先要感谢QQ号为:1084830483(路在远方),来自哈尔滨工程大学的同学赠送给 ...
- Go语言的堆栈分析
本文为理解翻译,原文地址:http://www.goinggo.net/2015/01/stack-traces-in-go.html Introduction 在Go语言中有一些调试技巧能帮助我们快 ...
- 【玩转单片机系列002】 如何使用STM32提供的DSP库进行FFT
前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT.在网上找了很多这方面的资料做实验并进行 ...
- 《App研发录》 源码
第1章源码: 1.1 重新规划Android项目结构 1.1.zip 1.2 为Activity定义新的生命周期 1.2.zip 1.3 统一事件编程模型 1.3.zip 1.4 实体化编程 1.4. ...
- How To Use Goto?
看到,网上很多人对于goto的询问, 因为本身在工作中经常使用到,所以写下此文, 如有错误, 请指出. 本人写博文的时候主要从事C++工作 对于goto的态度,本人目前成长如下: 学生时代 老师课堂上 ...
- TDR分辨率
在日常的生活工作中,有很多测试测量的工具,比如测量长度的尺子,计量时间的钟表等等,谈到测试测量工具的时候,分辨率是关键指标之一,比如尺子的 分辨率是1mm,时钟的分辨率是秒.所谓分辨率就是测试测量工具 ...
- JSP的基本语法
JSP的基本语法 一.JSP页面中的JAVA代码 二.JSP页面中的指令 三.JSP页面中的隐含对象(九大内置对象) 目录 一.JSP页面中的JAVA代码 JSP表达式(方便输出) JSP小脚本(完成 ...
- Java集合类的组织结构和继承、实现关系
Collection继承.实现关系如下(说明(I)表示接口,(C)表示Java类,<--表示继承,<<--表示实现): (I)Iterable |<--(I)Collectio ...