`

Form表单身份验证例子

阅读更多

http://topic.csdn.net/t/20050830/10/4239405.html(转)

步骤:

一直对forms验证中的角色很模糊,不知道怎么搞,昨天晚上仔细看了下csdn的杂志,心里稍微有点底,今天早晨一上csdn,就看到思归大人回的一篇贴,是关于asp.net中的forms验证roles,地址是:http://www.codeproject.com/aspnet/formsroleauth.asp
汗,怎么是E文,我的e文特差,但是不知道为什么这次竟然被我看懂了,模仿他的做,竟然成功!,特把过程以及我的理解写出来,希望对和我一样的菜鸟有点帮助,同时我的一些理解可能错误,希望各位老大们能够指出,非常感谢,下面我开始边翻译边按照他的做:
1,首先我们新建一个数据库,名字叫web,添加一个表叫users,里面有三个字段,username字段为主键,username和password字段设置为联合索引,不知道我这样理解对么?请指正
CREATE
DATABASE web

CREATE TABLE users
(
username nvarchar(64) CONSTRAINT users_PK PRIMARY KEY,
password nvarchar(128),
roles nvarchar(64)
)

CREATE INDEX credentials ON users
(
username,
password
)

我们再在users表中添加两个用户:pwqzc 123456 Administrator,User
pwq 123456 User
第一个为名字,第二个为密码,第三个为用户所具有的角色,多个角色用,逗号分开

2,创建一个登陆页login.aspx
里面放两个TextBox和一个按钮,在按钮的单击事件里写代码:
private void btnLogin_Click(object sender, System.EventArgs e)
{
//初始化FormsAuthentication
FormsAuthentication.Initialize();
//创建个connection和command对象
SqlConnection conn = new SqlConnection("server=(local);uid=sa;pwd=mydream54win;database=web");
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select roles from users where username=@username and password=@password";
//添加参数以及给参数赋值
cmd.Parameters.Add("@username",SqlDbType.VarChar,64);
cmd.Parameters["@username"].Value = Username.Value;
cmd.Parameters.Add("@password",SqlDbType.VarChar,128);
cmd.Parameters["@password"].Value = Password.Value;
//打开数据库连接
conn.Open();
//执行命令
SqlDataReader reader = cmd.ExecuteReader();
if(reader.Read())
{
//创建一个新的验证票FormsAuthenticationTicket
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,//票版本号
Username.Value,//cookie名字
DateTime.Now,//生成cookie时间
DateTime.Now.AddMinutes(30),//cookie的有效时间
false,//是不是永久存在的cookie
reader.GetString(0));//从数据库读到的用户角色数据
//把验证票加密
string hashTicket = FormsAuthentication.Encrypt(ticket);
//设置验证票cookie,第一个参数为cookie的名字,第二个参数为cookie的值也就是加密后的票
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,hashTicket);
//设置cookie的有效期是一个礼拜
cookie.Expires = DateTime.Now.AddDays(7);
//把cookie加进Response对象发生到客户端
Response.Cookies.Add(cookie);
//得到请求的url
string requestUrl = FormsAuthentication.GetRedirectUrl(FormsAuthentication.FormsCookieName,false);
//不要使用FormsAuthentication.RedirectFromLoginPage方法,因为这个方法会重写cookie
//重新定向到请求的url
Response.Redirect(requestUrl);
}
else
{
//如果不存在此用户,则提示一些错误
ErrorLabel.Text = "用户名或者密码错误,请重试!";
ErrorLabel.Visible = true;
}
//关闭数据库连接和reader
reader.Close();
conn.Close();
}


3,第三步,在应用程序的Global.asax中,找到Application_AuthenticateRequest,写下面代码,记的要导入using System.Security.Principal;
using System.Web.Security;这两个名字空间,代码如下:
protected void Application_AuthenticateRequest(Object sender,EventArgs e)
{
if(HttpContext.Current.User!=null)//如果当前的http信息中存在用户信息
{
if(HttpContext.Current.User.Identity.IsAuthenticated)//如果当前用户的身份已经通过了验证
{
if(HttpContext.Current.User.Identity is FormsIdentity)
{
//如果当前用户身份是FormsIdentity类即窗体验证类,此类有个属性能够访问当前用户的验证票
FormsIdentity fi = (FormsIdentity)HttpContext.Current.User.Identity;//创建个FormsIdentity类,用他来访问当前用户的验证票
//获得用户的验证票
FormsAuthenticationTicket ticket = fi.Ticket;
//从验证票中获得用户数据也就是角色数据
string userData = ticket.UserData;
//把用户数据用,分解成角色数组
string[] roles = userData.Split(',');
//重写当前用户信息,就是把角色信息也加入到用户信息中
HttpContext.Current.User = new GenericPrincipal(fi,roles);
}
}
}
}

4,第四步,修改web.config
<configuration>
<system.web>
<authentication mode="Forms">
<forms name="MYWEBAPP.ASPXAUTH"
loginUrl="login.aspx"
protection="All"
path="/"/>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
<location path="admins">
<system.web>
<authorization>
<!-- Order and case are important below -->
<allow roles="Administrator"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<location path="users">
<system.web>
<authorization>
<!-- Order and case are important below -->
<allow roles="User"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
</configuration>

5,测试,在应用程序下新建两个目录admins和users,分别在他们的目录下放个default.aspx,上面随便写些什么东西,把其中的一个default.aspx设置问起始页(在vs2003环境下),如果你输入名字pwq和密码是不能够进入admins目录下的,因为这个用户不属于Administrator角色!

//初始化FormsAuthentication
FormsAuthentication.Initialize();
//创建个connection和command对象
SqlConnection conn = new SqlConnection("server=(local);uid=sa;pwd=mssql;database=Test");
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select roles from users where username=@username and password=@password";
//添加参数以及给参数赋值
cmd.Parameters.Add("@username", SqlDbType.VarChar, 64);
cmd.Parameters["@username"].Value = this.TextBox1.Text;
cmd.Parameters.Add("@password", SqlDbType.VarChar, 128);
cmd.Parameters["@password"].Value = this.TextBox2.Text;
//打开数据库连接
conn.Open();
//执行命令
SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{

//FormsAuthentication.SetAuthCookie("sanlang", false);

//创建一个新的验证票FormsAuthenticationTicket

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,//票版本号
this.TextBox1.Text,//cookie名字
DateTime.Now,//生成cookie时间
DateTime.Now.AddMinutes(30),//cookie的有效时间
false,//是不是永久存在的cookie
reader.GetString(0));//从数据库读到的用户角色数据

//把验证票加密
string hashTicket = FormsAuthentication.Encrypt(ticket);
//设置验证票cookie,第一个参数为cookie的名字,第二个参数为cookie的值也就是加密后的票
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);
//设置cookie的有效期是一个礼拜
//cookie.Expires = DateTime.Now.AddDays(1);
//把cookie加进Response对象发生到客户端
Response.Cookies.Add(cookie);
//得到请求的url
string requestUrl = FormsAuthentication.GetRedirectUrl(FormsAuthentication.FormsCookieName, false);
//不要使用FormsAuthentication.RedirectFromLoginPage方法,因为这个方法会重写cookie
//重新定向到请求的url
Response.Redirect(requestUrl);
}
else
{
//如果不存在此用户,则提示一些错误
this.Label3.Text = "用户名或者密码错误,请重试!";
this.Label3.Visible = true;
}
//关闭数据库连接和reader
reader.Close();
conn.Close();

说明:

我们来看下Forms身份验证基本原理:
一 身份验证
要采用Forms身份验证,先要在应用程序根目录中的Web.config中做相应的设
置:
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="login.aspx" timeout="30"
path="/"/>
</authentication>
其中<authentication mode="Forms"> 表示本应用程序采用Forms验证方
式。
<forms>标签中的name表示指定要用于身份验证的Cookie。默认是.ASPXAUTH,其实你可以用任何名字,这也就是你在本地硬盘上看到的cookie里面的前面的几个字.
Forms的验证过程如下:1,生成身份验证票,2,加密身份验证票.3,写回客户端,4,浏览器重新定向.其实这一系列的动作如果我们不用roles的话都是通过FormsAuthentication.RedirectFromLoginPage方法来完成了这一系列的工作任务.但是既然我们要使用roles授权,我们就不能够使用这个方法,而要分开来,一步步完成.
首先是创建身份验证票,首先我们看看FormsAuthenticationTicket类的一个构造函数:
public FormsAuthenticationTicket(
int version, //设为1
string name, //用户标示
DateTime issueDate, //Cookie 的发出时间, 设置为 DateTime.Now
DateTime expiration, //过期时间
bool isPersistent, //是否持久性(根据需要设置,若是设置为持久性,在发出
cookie时,cookie的Expires设置一定要设置)
string userData, //这里用上面准备好的用逗号分割的role字符串
string cookiePath // 设为”/”,这要同发出cookie的路径一致,因为刷新cookie
要用这个路径
);
最后个参数可以省略
FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket
(1,”kent”,DateTime.Now, DateTime.Now.AddMinutes(30), false,UserRoles)

然后加密:

string hashTicket = FormsAuthentication.Encrypt(ticket);
//设置验证票cookie,第一个参数为cookie的名字,第二个参数为cookie的值也就是加密后的票
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,hashTicket);
//设置cookie的有效期是一个礼拜
cookie.Expires = DateTime.Now.AddDays(7);
//把cookie加进Response对象发生到客户端
Response.Cookies.Add(cookie);
//得到请求的url
string requestUrl = FormsAuthentication.GetRedirectUrl(FormsAuthentication.FormsCookieName,false);
//不要使用FormsAuthentication.RedirectFromLoginPage方法,因为这个方法会重写cookie
//重新定向到请求的url
Response.Redirect(requestUrl);

web.config

<?xml version="1.0"?>
<!--
注意: 除了手动编辑此文件以外,您还可以使用
Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
“网站”->“Asp.Net 配置”选项。
设置和注释的完整列表在
machine.config.comments 中,该文件通常位于
\Windows\Microsoft.Net\Framework\v2.x\Config 中
-->
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<compilation debug="true"/>
<authentication mode="Forms">
<forms name="MYWEBAPP.ASPXAUTH" loginUrl="login.aspx" protection="All" path="/"/>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
<location path="admins">
<system.web>
<authorization>
<!-- Order and case are important below -->
<allow roles="Administrator"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<location path="users">
<system.web>
<authorization>
<!-- Order and case are important below -->
<allow roles="User"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
</configuration>

分享到:
评论

相关推荐

    asp.net基于Form身份验证的相关资料,覆盖面比较全

    汇总asp.net基于Form身份验证的相关资料,覆盖面比较全 内有2个文档说明还有几个HTML代码例子来说明。

    React:我学习React的旅程

    项目做什么 这个项目是我做的一些小项目的集合,这是我学习ReactJs的过程中学习曲线的一部分每个小项目都有自己的自述文件它涵盖以下主题 ...通用且易于使用的表单组件-Forms / form_simple_input_with_

    浅谈ASP.net安全编程

    答案是肯定的,现在.NET构架在System.Security.Cryptography命名空间里提供了许多加密类可以利用,包括安全的数据编码和解码以及散列法、随机数字生成和消息身份验证。下面,我们来看看几个比较典型的例子,以供参考...

    spring-boot-security-jwt:使用Spring Boot + Security + JWT用于REST端点的项目

    Spring启动安全性使用Spring Boot + Security + JWT进行REST端点身份验证/授权的项目。关于例子Spring Boot 1.5.4。发布Sprign Framework 4.3.9。发布Spring Security 4.2.3。发布Tomcat嵌入8.5.15 乔达日期时间...

    hummingbird-examples:蜂鸟示例代码

    form-将HTML表单链接到Hummingbird应用程序 添加了升级的基本应用程序 使用Fluent的用户名/密码和会话身份验证。 使用Redis的用户名/密码和会话身份验证。 基于规范的Todos应用程序,使用DynamoDB 基于规范的...

    ZendFramework中文文档

    3.1.3. 身份的持久(Persistence) 3.1.3.1. 在PHP Session 中的缺省持久(Persistence) 3.1.3.2. 实现订制存储 3.1.4. 使用Zend_Auth 3.2. 数据库表认证 3.2.1. 简介 3.2.2. 高级使用:持久一个 DbTable ...

    php网络开发完全手册

    11.1.1 表单标签form 166 11.1.2 输入标签input与文本框 167 11.1.3 按钮 168 11.1.4 单选框与复选框 169 11.1.5 多行文本域标签textarea 171 11.1.6 下拉框与列表框标签select 172 11.2 表单数据的接收 173 11.2.1 ...

    Spring Security 中文教程.pdf

    24. 替换验证身份 24.1. 概述 24.2. 配置 A. 安全数据库表结构 A.1. User表 A.1.1. 组权限 A.2. 持久登陆(Remember-Me)表 A.3. ACL表 A.3.1. Hypersonic SQL A.3.1.1. PostgreSQL B. 安全命名...

    SpringSecurity 3.0.1.RELEASE.CHM

    23. 替换验证身份 23.1. 概述 23.2. 配置 A. 安全数据库表结构 A.1. User表 A.1.1. 组权限 A.2. 持久登陆(Remember-Me)表 A.3. ACL表 A.3.1. Hypersonic SQL A.3.1.1. PostgreSQL B. 安全命名空间 B.1....

    Spring Security-3.0.1中文官方文档(翻译版)

    24. 替换验证身份 24.1. 概述 24.2. 配置 A. 安全数据库表结构 A.1. User 表 A.1.1. 组权限 A.2. 持久登陆(Remember-Me)表 A.3. ACL 表 A.3.1. Hypersonic SQL A.3.1.1. PostgreSQL B. 安全...

    asp.net知识库

    一个XSLT的简单例子 XSLXSLT板主题整理 xsl入门的好文章 新手学习XSL的好东西 XSL语法介绍 XSL学习心得 - 调用属性值 XSLT与XML转换的详细介绍 功能应用 读写搜索 基础教程 RSS Web2.0时代,RSS你会用了吗?(技术...

    net学习笔记及其他代码应用

    19.ASP.net的身份验证方式有哪些?分别是什么原理? 答:10。Windwos(默认)用IIS...From(窗体)用帐户....Passport(密钥) 20.什么是Code-Behind技术? 答:代码后植。 21.在.net中,配件的意思是? 答:程序集。...

Global site tag (gtag.js) - Google Analytics