登陆代码(转贴自csdn)

一直对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角色!

转贴自 CNHONKER】 让我们回归。

01-04

笔记(1)rn本类热门rn提交文章: bkbllrn提交日期: 2003-09-20rn文章属性: 转载rn文档类别: 安全技术rn浏览次数: 今3次/总5898次rn原文引自论坛:http://www.cnhonker.com/forums/index.php?showtopic=4968rn个人感受,文字粗糙,语言无条理,望多多见谅rn让我们回归rn我---曾经很是自以为是的人---以前天真之极:认为自己的编程水平不敢说是高手,那么至rn少也脱离了初学者了---不管怎么说,我rn也是有过近万行代码编程经验的人,也开发过5000多行代码的程序;而且还表面谦虚地把rn代码给网友看,在得到一些高人的鼓励后,rn表面依然谦虚的说上些客套话,然后独自洋洋得意起来;在同学面前,大肆谈论着计算机--rn-尽管他们未必明白我说的东西,但我的rn目的是:让他们觉得我已经脱离世俗,来到了程序设计的极高境界⋯⋯⋯⋯⋯⋯如今想rn来,我是那么虚伪,那么天真,那么⋯⋯⋯rn然而,有一天我逛书店时---依旧只奔向计算机书籍---发现了一个计算机界众所周知却很多rn人都忽视的事物:计算机理论知识!rn没错!理论!也许各位会说:理论的东西,要应用到实践中的~没错!!绝对没错!!但rn是,我要问:你理论掌握的如何?编译原理?rn操作系统?数据结构?算法?有多少人敢说这些东西他都已经烂熟于心了?这些不掌握rn好,如何去指导实践?rn因此,我强烈建议:让我们回归,回归到理论,并将理论应用到实践中去。rn似乎提到理论,很多人都要想到枯燥,乏味,没用。首先,我声明:我绝对反对那种钻牛rn角尖行为,但是,也绝对反对那些绝对实践rn主义。我们要认识到:实践确实可以产生并检验理论,但同时,理论更可以指导实践!我rn不想讨论过多的哲学上的问题---这方面我rn不在行---但是我希望能通过我的文章,唤醒那些依然沉浸在所谓的“实践”中的人们。rn记得我曾经网上遇到一位兄弟,很是狂妄自大,自称:“在和某某人学黑客”(我才智愚rn钝,不懂“黑客”这东西怎么学,但这位兄rn弟的确是这么说的)当问起他:“你用什么编程?”时,他的回答是:“我的方向是黑客,rn不是程序设计”⋯⋯⋯⋯当时只想不再理rn这人了,但是碍于面子(他是我朋友的网友⋯⋯真不知道我朋友的交友原则是什么⋯⋯)没这rn么作。之后,我问他是否看过Richard的rn《TCP/IP详解》(既然是“学黑客”的,这种就连我这愚才也读过的黑客圣经级别的书应该rn看过吧⋯⋯)他却问:“那是什么?”之rn后,他说了N多个完全不符合基本原理的话(当时真是怀疑他喝酒了)最后我实在无奈了,告rn诉他:“你看看一些理论方面的东西吧,rn不要想什么入侵什么攻击,更不要想流光怎么用,冰河怎么用这些问题了⋯⋯”(其实,我rn说的《TCP/IP详解》之类的书还不算是真rn正意义上的计算机理论书籍)他的回答确实很强:“理论?理论能干什么?”我当时二话没rn让我们回归(by 默难)rn错---管他面子不面子---就请这位“高rn人”入了我的黑名单⋯⋯rn这种人实在是受不了的,他们简直是完完全全的片面实用主义(注意我的定语:我看他们这rn种人不算什么实用主义)他们只是想知道:rn现在这个问题应该怎么解决,而不是考虑:为什么会有这种问题,这种问题的根源是什么,rn原理是什么?根据原理是否还会有其他rn问题?等等~rn还有一些人,他们热衷于特定语言的基本特性,他们考虑着很多非常实用的问题---这些都是rn很好的现象,当初我也是如此,但是,rn他们似乎总忽略一些事情,比如:程序的算法,不要忘记:rnAlgorithm---the Spirit of Computingrn不管你用这门语言多么熟练,不管你背下多少标准库和系统函数,但是,你光有这些,而忽rn略算法的重要性,那么绝对不会写出高rn效率的程序的。rn似乎程序员很怕内存管理方面的错误:内存泄露,野指针等等,因为他们很难被查觉到。但rn是,算法上的问题,却是比这些问题还rn要棘手的:也许一个程序正常运行了,没有错误,运行良好,但是,如果它的算法是不完善rn的,那么,也许程序员一辈子也不会发rn现。rn现在似乎都在忽视着算法这个重要的东西,看看吧:RSA的设计者(Ronald L. Rivest;AdirnShamir;Leonard M. Adleman)荣获rn此殊荣,但是,又有多少媒体报道了这件事情呢?用google搜索:“RSA 图灵奖 2002”rn(引号不算为搜索关键字),结果只有可rn怜的25项⋯⋯其中还有一些是与这件事无关的新闻⋯⋯大家都怎么了?难道这种计算机界的rn大事不该好好宣传一下吗?rn再来看看我们的书店吧~我是属于常逛书店的人,加上在首都北京,应该算是文化底蕴比较rn丰厚的了,那么书店里面计算机书籍情rn况如何呢?rn一个中等型号的书店,里面的计算机书只有廖廖几个书架,而都是什么书籍呢?我们来看rn看:rn最多的就是些入门书籍,什么windows操作,五笔,练打字等等rn其次是一些图象处理书籍:PhotoShop Flash等等rn接着是些办公软件,网页制作之类的:Office(95%左右的办公软件书籍都是Office⋯⋯)rnFrontpage等等rn还有就是系统管理,数据库之类:Win2k系统管理 Linux系统管理 SQL等等rn还有程序设计:主要是些入门书籍,21天学通C++(我不知道作者是何等高人,21天就可以rn学通C++⋯⋯)而主要的还是VB ASP等等rn对了~还有一个很大很大的团体:网络安全,这里面有用的书籍我看就那么几本:密码学 网rn络安全真相,而更多的是那些“片面rn实用主义”们读的读物:《黑客,就这么几招》(挺佩服作者的,居然起了这么强的书rn名⋯⋯说实在的,如今的一些“黑客”rn---似乎叫他们骇客更合适---也就是那么几招了⋯⋯)那些书我翻了翻,暗自觉得好笑:把一rn个个的屏幕截图放到书上,然后在旁rn边做上标识,告诉你:点这个键⋯⋯与其说是教“网络安全”不如说是教windows基础操rn作⋯⋯rn而最最惨的,就是计算机理论方面的书籍了,廖廖几本,前几天想找个算法方面的书,到了rn书店,猛翻海找,才找到3种⋯⋯还有rn一些数据结构的书,里面理所当然也要介绍些算法,总共加起来不过6种⋯⋯至于编译原rn理,操作系统这些书更是稀有品种⋯⋯rn其实,像Richard的APUE,《TCP/IP详解》,UNIX网络编程,还有道戈拉斯的《计算机网rn络》,Andrew的rn《C Traps and Pitfalls》等等那些书籍,绝对是经典,值得一读的。但是,像数据结构,编rn译原理,算法设计操作系统等等的rn理论方面书籍也要重视,他们才是计算机的真正灵魂,无论计算机如何发展,如果你能了解rn计算机的理论知识,那么你就很容易走rn在时代前沿,就好像:如果你只知道1+1=2,那么你不会作出其他加法题,如果你学会加法,rn那么无论是1+1 1+2 1+3还是多少加多rn少,你都可以迎刃而解~rnrnCopyright © 2000-2004 HUC All Rights Reserved.rn中国红客网络技术联盟 www.cnhonker.comrnwebmaster@cnhonker.netrnrn----------------------------rn学习....语言 算法 数据结构 设计模式。。。中。。rnrnps. 唉 CNHONKER关闭了,郁闷!!rnrn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭