asp.net在页面的context.user里面放了一个实现iprincipal的对象,用来实现对已验证用户的管理。asp.net系统中,通常采用的方式就是扩展这个context.user,让它里面保存定制的信息。
1、扩展方式
扩展方式基本上有两种:直接利用genericprincipal和自己写一个实现iprincipal的类。ibuyspy用的前者,优点就是n简单。
context.user = new genericprincipal(context.user.identity, roles);
roles是一个保存了当前用户的角色信息的string,各个角色间用“;”分隔,由前面的代码调用数据层中的userdb.getroles()方法来得到。
自己写一个实现iprincipal的类其实也是n简单,你只需要实现两个接口:identity属性返回一个iidentity的用户标识对象,isinrole(string role)判断用户是否具有参数中的角色。下面是我写的一个替代ibuyspy中原有扩展模式的类:
public class ibsprincipal : iprincipal {
private iidentity _identity;
private string[] _asrole;
下面是两个构造函数:
public ibsprincipal(iidentity identity, string roles) {
_identity = identity;
_asrole = roles.split(;);
}
public ibsprincipal(iidentity identity, string[] roles) {
_identity = identity;
_asrole = roles;
}
然后是用来实现iprincipal的一个属性和一个方法:
public iidentity identity {
get {
return _identity;
}
}
public bool isinrole(string role) {
// 下面一行幸得“jgtm2003”告知array有一个static的indexof()
// 原来是用循环查询_asrole….土不可及…
return (system.array.indexof(_asrole, role) > -1);
}
ok,然后我们就可以用下面这句替代上面ibuyspy原有的那句了:
context.user = new ibsprincipal(context.user.identity, roles);
看起来好像自己创建这个ibsprincipal并不划算,它没有提供比genericprincipal更多的功能,但好处是我们以后可以随时扩展它,而且实现的成本也很低。
2、时机
我们在什么时候进行上面所说的这样的扩展行为呢?
ibuyspy选择在global.asax里面的application_authenticaterequest事件里面进行这些动作,只要asp.net程序需要进行用户验证,那么肯定要经过这里,这个地方不错。
另一个好地方就是在“页面基类”的page_init方法中,我们在构造网站的时候就可以先构建一个“页面基类”(即使一开始里面什么都没有),所有的页面都从这个基类继承下来而不是从默认的system.web.ui.page,这样做的好处是我们可以随时把类似的动作放在基类中。可惜ibuyspy本身并没有应用这种“页面基类”的方式。
3、formsauthenticationticket
这个类是一个“验证票据”类,我们可以利用这个票据来保存用户的信息,并把这个票据写到客户端的cookie里面,以后客户再来时,从cookie中把这个票据取回来,就可以得到用户的信息了。
上面这一段说的就是ibuyspy做的,但是一定要注意,我们自己做这些操作,和asp.net内置的forms验证没有任何关系,虽然它也是通过类似的保存票据到cookie来实现的。
用这个票据来写到cookie与我们自定义一个cookie去写相比有什么好处呢,首先可以设定票据的过期时间、决定是否永久在cookie保存票据、票据中可以写入自定义的信息(比如用户所具有的角色),而且,.net内置的formsauthentication.encrypt()方法和formsauthentication.decrypt()方法可以把一个票据加密成一个字符串,和从一个字符串解密出一个票据,这样省掉了我们很多的工作了。
来看看ibuyspy里面的代码,创建一个票据并写到cookie:
formsauthenticationticket ticket = new formsauthenticationticket(
1, // version
context.user.identity.name, // user name
datetime.now, // issue time
datetime.now.addhours(1), // expires every hour
false, // dont persist cookie
rolestr // roles
);
// encrypt the ticket
string cookiestr = formsauthentication.encrypt(ticket);
// send the cookie to the client
response.cookies[“portalroles”].value = cookiestr;
response.cookies[“portalroles”].path = “/”;
response.cookies[“portalroles”].expires = datetime.now.addminutes(1);
从cookie中读出票据,再从票据中得到用户具有的角色:
// get roles from roles cookie
formsauthenticationticket ticket = formsauthentication.decrypt(context.request.cookies[“portalroles”].value);
//convert the string representation of the role data into a string array
arraylist userroles = new arraylist();
foreach (string role in ticket.userdata.split( new char[] {;} )) {
userroles.add(role);
}
roles = (string[]) userroles.toarray(typeof(string));
关于IBuySpy里面用户权限验证方面的东西-.NET教程,Asp.Net开发
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 关于IBuySpy里面用户权限验证方面的东西-.NET教程,Asp.Net开发
相关推荐
-      VS2010的aspx文件中的html代码的格式化方法
-      .net 反序题目的详细解答第1/2页
-      asp.net创建html文本文件实例
-      比较完整的 asp.net 学习流程
-      C# XML操作 代码大全(读XML,写XML,更新,删除节点,与dataset结合等)第1/2页
-      官网 Ext direct包中.NET版的问题
-      c# 连接字符串数据库服务器端口号 .net状态服务器端口号
-      asp.net教程:简单的C#图片上传代码或C#文件上传代码