仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 760|回复: 7
打印 上一主题 下一主题

[学习教程] ASP.NET网站制作之ASP.NET基于脚色的窗体平安认证机制

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:39:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
来吧!老师们!我代表千千万万的asp.net/C#的初学者在这里呼唤着!asp.net|平安  申明:两个月前我刚学ASP.NET,在codeproject.com看到标题叫Role-basedSecuritywithFormsAuthentication的文章,以为很有匡助。事先就想翻译成中文。不外间接翻译其实没意义,这两天我参照HeathStewart的这篇文章,而且依据本人的了解,把它依照本人的设法和表达体例写成中文。附带上本人为这篇文章做的一个演示的web使用程序。
  假如有了解毛病的中央,接待来信指出或宣布批评。
  提要:
  ASP.NET供应了基于脚色(即Roles)的认证机制,但是它对脚色的撑持是不完整的。本文试图经由过程一些例子来讲明怎样完成和利用这类基于脚色的认证机制。
  简介:
  ASP.NET中窗体认证是一个功效十分壮大的特征,只必要很少的代码就能够完成一个复杂的平台有关的平安认证体系。
  可是,假如你必要一个更庞大更无效的认证机制,那末你就要把浩瀚用户分红用户群组,以使用它的天真性。Windows集成认证供应了这类认证机制,但它利用的是NTLM,即WindowsNTLANManager,因此它不是跨平台的。如今愈来愈多的人利用Linux体系,而MozillaForefox扫瞄器用户也愈来愈多,我们一定不克不及把这些人拒之门外,因而我们追求别的的认证机制。有两个选择:一是为网站分别多个地区,供应多个登录页面,强制用户一个一个的往注册和登录;二是把用户分组,而且限定特定用户组对某页面大概某地区会见的权限。后者固然是更好的选择。经由过程分派脚色给各个用户,我们可以完成这类功效。
  微软为.NET平台留下了窗体认证中基于脚色的认证机制,可是我们必需本人往完成它。本文力图掩盖窗体认证中基于脚色的认证机制的一些基础的器材,好比它的观点,它的完成,怎样在Web使用程序中使用等。

  需要筹办:
  我们起首要创建一个数据库,一个Web使用项目,几个分歧平安级其余秘密目次,和几个ASP.NET页面。固然你也能够在你现有的Web使用项目中增加这些。
  1、创立数据库
  起首要选择你必要利用的数据库办理体系DBMS。本文利用SQLServer2000。
  在实践使用项目标数据库中,一样平常城市有效户数据表Users,它大概包含用户独一标志:UserID,用户名:UserName,暗码:Password,用户的邮件地点:Email,用户地点乡村:City,用户登录次数LoginCount等。能够经由过程创立一个UserInRoles数据表(一样平常能够包含两个字段,用户名:UserName,用户脚色:UserRoles)来完成为用户分派脚色。
  为了复杂,我只创立一个Users数据表,它有3个字段,用户名UserName,暗码Password,用户脚色UserRoles。创立表之前,你要选择数据库,大概创立一个新的数据库。要创立一个新的定名为WebSolution的数据库,只必要复杂的SQL语句:
CreateDATABASEWebSolution
GO
  要选择一个叫msdb的数据库,可使用SQL语句:
USEmsdb
GO
  接上去,我们创立方才提到的Users数据表,SQL剧本以下:
CreateTABLEUsers
(
UserNamenvarchar(100)CONSTRAINTPK_UserNamePRIMARYKEY,
Passwordnvarchar(150),
UserRolesnvarchar(100)
)
  能够为这个表创立索引Credentials,SQL语句以下:
CreateINDEXCredentialsONUsers
(
UserName,
Password
)
  是不是创立索引是可选的,由你本人决意。索引的优点和害处请参考相干材料。
  然后我们为这个Users数据库增加数据。脚色称号由你本人自在选择,可是最好用成心义的称号,好比"Administrator"(顶级办理员),"Manager"(办理员),"Member"(加盟成员),"User"(一般用户)等。比方:
UserName|Password|Roles
"willmove"|"pwd123"|"Administrator,User"
"amuhouse"|"pwd123"|"User"
  其SQL语句是:
  --注重45CB41B32DCFB917CCD8614F1536D6DA是pwd123利用md5加密后的字符串
InsertINTOUsers(UserName,Password,UserRoles)VALUES(willmove,45CB41B32DCFB917CCD8614F1536D6DA,Administrator,User)
GO
InsertINTOUsers(UserName,Password,UserRoles)VALUES(amuhouse,45CB41B32DCFB917CCD8614F1536D6DA,User)
GO
  要注重的是脚色Roles是巨细写敏感的,这是由于在Web.config文件中是巨细写敏感的。如今我们为完成这个平安认证机制创立几个需要的页面。
  起首是用户登录页面Login.aspx
  假如还没有创立Web使用程序,那就如今创立一个。固然你也能够在一个已有的Web使用程序中创立这个页面。这里我假定已创立了一个称号为RolebasedAuth的Web使用程序(即VisualStudio.Net中的Project)。我把这个Login.aspx放在它的根目次下,也就是经由过程http://localhost/RolebasedAuth/Login.aspx能够会见。
  这个Login.aspx放在那里是无所谓的,可是它必需是公家有权限会见的。
  在使用程序根路径下,我们创立两个秘密的子目次,分离是Admin和User。
  接上去,我们创立一个撑持脚色认证的窗体认证登录体系。由于微软没有供应复杂的完成机制,我们要本人花些工夫往创立认证单子。它必要存贮大批信息,固然,有些称号必需和Web.config中设置的一样,要不ASP.NET就会以为你的认证单子是有效的,从而强迫转向到登录页面。我们在VS.NET中为Login.aspx增加两个TextBox控件,取名UserNameTextBox,PasswordTextBox,再增加一个Button,取名LoginButton,点击它进进背景代码。在LoginButton_Click办法中增加必要的代码。以下:
privatevoidLoginButton_Click(objectsender,System.EventArgse)
{
//初始化FormsAuthentication
//注重它是在System.Web.Security定名空间
//因而要在代码入手下手增加usingSystem.Web.Security;
FormsAuthentication.Initialize();
//创立数据库毗连和数据库操纵命令工具
//注重它是在System.Data.SqlClient定名空间
//因而要在代码入手下手处增加usingSystem.Data.SqlClient;
SqlConnectionconn=
newSqlConnection("DataSource=sun-willmove;integratedsecurity=SSPI;InitialCatalog=WebSolution;");
SqlCommandcmd=conn.CreateCommand();
cmd.CommandText="SelectUserRolesFROMUsersWhereUserName=@username"+
"ANDPassword=@password";
//添补各个参数
cmd.Parameters.Add("@username",SqlDbType.NVarChar,100).Value=
UserNameTextBox.Text;
cmd.Parameters.Add("@password",SqlDbType.NVarChar,150).Value=
FormsAuthentication.HashPasswordForStoringInConfigFile(
PasswordTextBox.Text,"md5");//大概"sha1"
//实行数据库操纵命令
conn.Open();
SqlDataReaderreader=cmd.ExecuteReader();
if(reader.Read())
{
//为了完成认证,创立一个新的单子
FormsAuthenticationTicketticket=newFormsAuthenticationTicket(
1,//单子版本号
UserNameTextBox.Text,//单子持有者
DateTime.Now,//分派单子的工夫
DateTime.Now.AddMinutes(30),//生效工夫
true,//必要用户的cookie
reader.GetString(0),//用户数据,这里实在就是用户的脚色
FormsAuthentication.FormsCookiePath);//cookie无效路径
//利用呆板码machinekey加密cookie,为了平安传送
stringhash=FormsAuthentication.Encrypt(ticket);
HttpCookiecookie=newHttpCookie(
FormsAuthentication.FormsCookieName,//认证cookie的称号
hash);//加密以后的cookie
//将cookie的生效工夫设置为和单子tikets的生效工夫分歧
if(ticket.IsPersistent)cookie.Expires=ticket.Expiration;
//增加cookie到页面哀求呼应中
Response.Cookies.Add(cookie);
//将用户转向到之前哀求的页面,
//假如之前没有哀求任何页面,就转向到首页
stringreturnUrl=Request.QueryString["ReturnUrl"];
if(returnUrl==null)returnUrl="./";
//不要挪用FormsAuthentication.RedirectFromLoginPage办法,
//由于它会把方才增加的单子(cookie)交换失落
Response.Redirect(returnUrl);
}
else
{
//不要告知用户"暗码毛病",如许即是给了进侵者一个时机,
//由于他们晓得了他们输出的用户名是存在的
//
ErrorLabel.Text="用户名大概暗码毛病,请重试!";
ErrorLabel.Visible=true;
}
reader.Close();
conn.Close();
}
  前台aspx页面代码以下:
<%@Pagelanguage="c#"Codebehind="Login.aspx.cs"AutoEventWireup="false"Inherits="RolebasedAuth.Login"%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
<HTML>
<HEAD>
<title>Login</title>
<metaname="GENERATOR"Content="MicrosoftVisualStudio.NET7.1">
<metaname="CODE_LANGUAGE"Content="C#">
<metaname="vs_defaultClientScript"content="JavaScript">
<metaname="vs_targetSchema"content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body>
<formid="Form1"method="post"runat="server">
<P>
<asp:Labelid="Label1"runat="server">用户名:</asp:Label>
<asp:TextBoxid="UserNameTextBox"runat="server"></asp:TextBox></P>
<P><FONTface="宋体"></FONT>
<asp:Labelid="Label2"runat="server">暗码:</asp:Label>
<asp:TextBoxid="PasswordTextBox"runat="server"TextMode="Password"></asp:TextBox></P>
<P>
<asp:Labelid="ErrorLabel"runat="server"Visible="False"></asp:Label></P>
<P>
<asp:Buttonid="LoginButton"runat="server"Text="登录"></asp:Button></P>
</form>
</body>
</HTML>
  你会注重到下面我们对暗码的处置:将它哈希加密。哈希加密是一种单向算法(不成逆算法),天生独一的字符数组。因而即便是改动暗码中一个字母的巨细写,城市天生完整分歧的哈希列。我们把这些加密的暗码存储在数据库中,如许更平安。在实践使用中,你大概想为用户找回健忘的暗码。可是哈希散列是不成逆的,以是你就不成能恢回复来的暗码。可是你能够变动用户的暗码,而且把这个变动后的暗码告知他。假如一个网站可以给你旧暗码,那末你要思索分明了,你的用户数据是不平安的!现实上,国际年夜部分网站都是没有经由加密间接把用户的暗码存储到数据库中的。怎样一个黑客进侵乐成,那末这些用户帐户就很伤害了!
  假如没有利用SSL,你的暗码在收集中也是以明文传输的。传输过程当中大概会被夺取。在服务器端加密暗码只能包管暗码存储的平安。SSL相干的材料能够在http://www.versign.comhttp://www.thewte.com中找到。
  假如你不想以加密体例在数据库中存储暗码,你能够变动下面的代码,把
FormsAuthentication.HashPasswordForStoringInConfigFile(PasswordTextBox.Text,"md5")改成PasswordTextBox.Text便可。
  下一步,我们必要修正Global.asax文件。假如你的Web使用程序没有这个文件,请右键单击Web使用项目,选择"增加->增加新项...->GlobalApplicationClass"。在Global.asax大概Global.asax.cs中,找到叫做Application_AuthenticationRequest的办法(函数)。先要确认已包括大概利用了System.Security.Principal和System.Web.Security定名空间,然后修正它,修正后的代码:
protectedvoidApplication_AuthenticateRequest(Objectsender,EventArgse)
{
if(HttpContext.Current.User!=null)
{
if(HttpContext.Current.User.Identity.IsAuthenticated)
{
if(HttpContext.Current.User.IdentityisFormsIdentity)
{
FormsIdentityid=
(FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicketticket=id.Ticket;
//取存储在单子中的用户数据,在这里实在就是用户的脚色
stringuserData=ticket.UserData;
string[]roles=userData.Split(,);
HttpContext.Current.User=newGenericPrincipal(id,roles);
}
}
}
}
  认证单子(用户名和暗码)是没有作为cookie的一部分来存储的,并且也不成以,由于用户能够修正他们的cookie。
  现实上,FormsAuthentication是用你的呆板码(machinekey,一般在machine.config中)来加密单子(FormsAuthenticationTicket)的。我们利用UserData存储用户脚色,而且天生一个新的凭据。一旦凭据已创立,它会被增加到以后高低文中(即HttpContext),如许就能够用它来取回用户脚色了。
  接上去,我们设置秘密目次(也就是"平安目次",特定的利用者如办理员才有权限会见的目次)。起首看看你的Web使用程序根目次下是不是有Web.config这个文件,假如没有就创立一个。你也能够在你的子目次中创立Web.config文件,固然,这个Web.config文件是无限制的(一些参数它不成以设置)。要完成平安认证,在Web使用程序根目次下的Web.config文件中找到<system.web>节点下的
<authenticationmode="Windows"/>,把它修正为
<authenticationmode="Forms">
<formsname="AMUHOUSE.ASPXAUTH"
loginUrl="Login.aspx"
protection="All"
path="./"/>
</authentication>
<authorization>
<allowusers="*"/>
</authorization>
  下面的name="AMUHOUSE.ASPXAUTH"中,AMUHOUSE.ASPXAUTH这个称号是恣意的。要把持用户大概用户组的权限,我们能够有两种办法,一是设置在使用程序根目次下的Web.config文件,二是在秘密目次下创立一个自力的Web.config文件。(后者大概会对照好。)假如是前者,这个Web.config就应当包括有上面的内容(大概相似的内容):
<configuration>
<system.web>
<authenticationmode="Forms">
<formsname="AMUHOUSE.ASPXAUTH"
loginUrl="login.aspx"
protection="All"
path="/"/>
</authentication>
<authorization>
<allowusers="*"/>
</authorization>
</system.web>
<locationpath="./Admin">
<system.web>
<authorization>
<!--注重!上面几行的按次和巨细写长短常主要的!-->
<allowroles="Administrator"/>
<denyusers="*"/>
</authorization>
</system.web>
</location>
<locationpath="./User">
<system.web>
<authorization>
<!--注重!上面几行的按次和巨细写长短常主要的!-->
<allowroles="User"/>
<denyusers="*"/>
</authorization>
</system.web>
</location>
</configuration>
  为了使Web使用程序的目次之前不相互依附,能够对照便利的更名大概挪动,能够选择在每个平安子目次下设置独自的Web.config文件。它只必要设置<authorization/>节点,以下:
<configuration>
<system.web>
<authorization>
<!--注重!上面几行的按次和巨细写长短常主要的!-->
<allowroles="Administrator"/>
<denyusers="*"/>
</authorization>
</system.web>
</configuration>
  必要再次提示的是,下面的脚色roles是巨细写敏感的,为了便利,你也能够把下面修正为:
<allowroles="Administrator,administrator"/>
  假如你想同意大概克制多个脚色对这个目次的会见,能够用逗号离隔,如:
<allowroles="Administrator,Member,User"/>
<denyusers="*"/>
  至此,我们已为网站设置了基于脚色的平安认证机制了。你能够先编译你的程序,然后实验会见一个秘密目次,比方http://localhost/RolebasedAuth/Admin,这时候候你就会被转向到用户登录页面。假如你登录乐成,而且你的脚色对这个目次有会见权限,你就从头回到这个目次下。大概会有效户(或进侵者)妄图进进秘密目次,我们可使用一个Session来存储用户登录的次数,凌驾必定次数就不让用户登录,而且显现"体系回绝了你的登录哀求!"。
  上面,我们会商怎样依据用户脚色让Web控件显现分歧内容。
  偶然候依据用户的脚色来显现内容对照好,由于你大概不想为那末多分歧的脚色(用户群组)制造一年夜堆有很多反复内容的页面。如许的网站,各类用户帐户能够并存,付费的用户帐户可以会见附加的付费内容。另外一个例子是一个页面将显现一个"进进背景办理"按钮链接到背景办理页面假如以后用户是"Administrator"(初级办理员)脚色。我们如今就完成这个页面。
  我们下面用到的GenericPrincipal类完成了IPincipal接口,这个接口有一个办法名叫做IsInRole(),它的参数是一个字符串,这个字符串就是要考证的用户脚色。假如我们要显现内容给脚色是"Administrator"的已登任命户,我们能够在Page_Load中增加上面代码:程序代码
if(User.IsInRole("Administrator"))
AdminLink.Visible=true;
  全部的页面代码以下(为了烦琐,把背景代码也写在aspx页面):程序代码
<html>
<head>
<title>接待您!</title>
<scriptrunat="server">
protectedvoidPage_Load(Objectsender,EventArgse)
{
if(User.IsInRole("Administrator"))
AdminLink.Visible=true;
else
AdminLink.Visible=false;
}
</script>
</head>
<body>
<h2>接待!</h2>
<p>接待离开阿木小屋http://amuhouse.com/^_^</p>
<asp:HyperLinkid="AdminLink"runat="server"
Text="办理首页"NavigateUrl="./Admin"/>
</body>
</html>
  样,链接到Admin目次的HyperLink控件只会显现给脚色是Administrator的用户。你也能够依据为未登任命户供应一个链接到登录页面,如:程序代码
protectedvoidPage_Load(objectsender,System.EventArgse)
{
if(User.IsInRole("Administrator"))
{
AdminLink.Text="办理员请进";
AdminLink.NavigateUrl="./Admin";
}
elseif(User.IsInRole("User"))
{
AdminLink.Text="注册用户请进";
AdminLink.NavigateUrl="./User";
}
else
{
AdminLink.Text="请登录";
AdminLink.NavigateUrl="Login.aspx?ReturnUrl="+Request.Path;
}
}
  这里,我们经由过程设置叫做ReturnUrl的QueryString变量,可使用户登录乐成后前往到以后的这个页面.
  小结:
  本文用于匡助你了解基于脚色平安机制的主要性、有用性,而且也用ASP.NET完成了基于脚色的平安机制。它并非一个很难完成的机制,不外它大概必要一些相干常识如甚么是用户凭据,怎样认证用户身份,和怎样核定受权用户。假如你以为它很有匡助,我会十分乐意。我但愿它能够引诱你在你的网站中往完成基于脚色的窗体平安认证机制。
如果英语好,口才好,加上女孩子的优势说不定有机会进去做做别的工具)
再现理想 该用户已被删除
沙发
发表于 2015-1-19 20:42:11 | 只看该作者
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
飘灵儿 该用户已被删除
板凳
发表于 2015-1-27 06:22:37 | 只看该作者
微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
谁可相欹 该用户已被删除
地板
发表于 2015-2-11 03:01:17 | 只看该作者
在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?
老尸 该用户已被删除
5#
发表于 2015-3-1 20:09:32 | 只看该作者
Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。
山那边是海 该用户已被删除
6#
发表于 2015-3-10 22:57:30 | 只看该作者
asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!
小妖女 该用户已被删除
7#
发表于 2015-3-17 15:50:02 | 只看该作者
是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
蒙在股里 该用户已被删除
8#
发表于 2015-3-24 10:19:10 | 只看该作者
现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:17

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表