|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
缺点:安全性不是太差了,还行,只要你充分利用系统自带的工具;唯一缺点就是执行效率慢,如何进行网站优化以后,效果会比较好。1.利用Forms考证存储用户自界说信息
Forms考证在外部的机制为把用户数据加密后保留在一个基于cookie的单子FormsAuthenticationTicket中,由于是经由特别加密的,以是应当来讲是对照平安的。而.net除用这个单子寄存本人的信息外,还留了一个地给用户自在安排,这就是如今要说的UserData。
UserData能够用来存储string范例的信息,而且也享用Forms考证供应的加密回护,当我们必要这些信息时,也能够经由过程复杂的get办法失掉,分身了平安性和易用性,用来保留一些必需的敏感信息仍是很有效的。
上面来看怎样利用UserData,然后会给出一个实践利用的例子。
//创立一个新的单子,将客户ip记进ticket的userdata
FormsAuthenticationTicketticket=newFormsAuthenticationTicket(
1,userName.Text,DateTime.Now,DateTime.Now.AddMinutes(30),
false,Request.UserHostAddress);
//将单子加密
stringauthTicket=FormsAuthentication.Encrypt(ticket);
//将加密后的单子保留为cookie
HttpCookiecoo=newHttpCookie(FormsAuthentication.FormsCookieName,authTicket);
//利用到场了userdata的新cookie
Response.Cookies.Add(coo);
上面是FormsAuthenticationTicket机关函数的重载之一的办法署名
publicFormsAuthenticationTicket(
intversion,
stringname,
DateTimeissueDate,
DateTimeexpiration,
boolisPersistent,
stringuserData
);
参数
version
版本号。
name
与身份考证票联系关系的用户名。
issueDate
Cookie的收回工夫。
expiration
Cookie的到期日期。
isPersistent
假如Cookie是耐久的,为true;不然为false。
userData
将存储在Cookie中的用户界说数据
利用userdata也很复杂,FormsIdentity的Ticket属性就供应了对以后单子的会见,取得单子后就能够用UserData属性会见保留的信息,固然是经由解密的。
((System.Web.Security.FormsIdentity)this.Context.User.Identity).Ticket.UserData
上面是一个详细的使用。
因为Forms考证是经由过程cookie来举行的,它必要传送一个单子来举行事情。固然单子是加密的,内里的内容不成见,但这其实不能制止他人用一个冒充的身份利用单子(就像我们能够拿他人的钥匙往开他人的锁),对照罕见的就是分歧ip的用户在不平安通道截获了这个单子,然后利用它举行一些平安局限外的举动。
办理这个成绩的举措之一就是利用SSL来传送信息。
可是假如不克不及利用SSL呢?我们能够判别ip和单子是不是婚配,假如收回哀求的ip是初度发生单子的ip,则没有成绩,不然就烧毁这个单子。
为此,我们必要在一入手下手处置登录时将用户的ip保留起来,如许就能够在今后的哀求中随时考证后继哀求的ip是不是和初始ip不异。保留这个敏感ip的最好场合固然是UserData啦,而考证的机会则是在AuthenticateRequest事务产生时,即Global.aspx.cs中界说的处置此事务的Application_AuthenticateRequest办法中。
下面的示例实践上已是把用户ip保留到了UserData中,上面是考证的历程。
if(this.Request.IsAuthenticated)
{
if(((System.Web.Security.FormsIdentity)this.Context.User.Identity).Ticket.UserData!=this.Request.UserHostAddress)
{
System.Security.Principal.GenericIdentitygi=newSystem.Security.Principal.GenericIdentity("","");
string[]rolesi={};
System.Security.Principal.GenericPrincipalgpi=newSystem.Security.Principal.GenericPrincipal(gi,rolesi);
this.Context.User=gpi;
}
}
经由过程给GenericPrincipal空的GenericIdentity和roles使单子生效,如许将强制用户从头登录。为了测试这个办法,能够先把前提改成相称,看效果怎样:)
这个办法也有不敷的地方,详细为:
1.利用统一代办署理的用户将具有统一个ip,如许就不克不及提防此类冒充打击了
2.假如用户利用静态ip,则大概形成一般用户被我们强行烧毁单子。不外总的来讲,这个举措仍是对照可行的。
2.利用平安特征共同Forms考证举行平安操纵。
PrincipalPermissionAttribute能够共同Forms考证举行基于脚色或用户的平安考证,该特征不克不及用于程序集级别。它的感化局限能够是类或详细的办法。来看一个复杂的示例。
[PrincipalPermission(SecurityAction.Demand,User="Notus")]
publicclassTest:BasePage
{
privatevoidPage_Load(objectsender,System.EventArgse)
{
try
{
this.sayHello();
this.sayHello2();
}
catch(Exceptionex)
{
Response.Write(ex.ToString());
}
}
privatevoidsayHello()
{
Response.Write("helloworld!");
}
privatevoidsayHello2()
{
Response.Write("helloPrincipalPermissionAttribute!");
}
#regionWeb窗体计划器天生的代码
overrideprotectedvoidOnInit(EventArgse)
{
//
//CODEGEN:该挪用是ASP.NETWeb窗体计划器所必须的。
//
InitializeComponent();
base.OnInit(e);
}
///<summary>
///计划器撑持所需的办法-不要利用代码编纂器修正
///此办法的内容。
///</summary>
privatevoidInitializeComponent()
{
this.Load+=newSystem.EventHandler(this.Page_Load);
}
#endregion
}
注重这个例子一入手下手是感化于全部类的,天生后实行,假如以后用户不是Notus,就会产生非常System.Security.SecurityException,提醒对主体权限的哀求失利。反之,则能够顺遂会见,并输入两个helloworld!,注重是两个。如今的平安感化局限是全部类。
接上去我们改一下特征的感化局限。将特征声明移到sayHello2办法下面,从头编译后运转,就会发明程序在运转到sayHello2办法后抛出了System.Security.SecurityException。这申明如今平安感化局限减少到了办法级别。
该特征能够经由过程设置User和Role来举行基于用户和脚色的平安回护。别的其利用的第一个参数是SecurityAction列举,该列举设置了详细的回护级别或措施。像我们如今利用的这个Demand,是请求挪用仓库中的一切初级挪用方都已被授与了以后权限工具所指定的权限。
上面是msdn给的示例
示例
上面的示例申明能够怎样以声明体例利用PrincipalPermission请求以后用户是Bob而且属于Supervisor脚色。
[PrincipalPermissionAttribute(SecurityAction.Demand,Name="Bob",
Role="Supervisor")]上面的示例申明怎样请求以后用户的身份是Bob,与脚色成员前提有关。
[PrincipalPermissionAttribute(SecurityAction.Demand,Name="Bob")]
上面的示例申明怎样仅请求</p>asp,jsp,php是web开发的三大技术,asp简单易用且有microsoft做靠山,jsp功能强大是因为有java支持,php则开源跨平台.在国内,asp应用范围最广,jsp发展势头最猛,php则处于劣势.这可能与公司的支持以及技术的培训有关. |
|