asp.net 角色身份验证的使用

序:其实就是将角色写入cookie或session,在每次请求时检查这个字符串。 

ASP.NET有三种验证模式:windows,forms,passport。其中forms验证使用的最多。

          forms验证对基于验证授权提供了很好的支持,可以通过session,cookie对用户信息就行保存,使前后台有很好的信息沟通。

不过问题也来了,我们在做设计时往往需要基于角色的管理,有人会说了,ASP.NET给了一个角色管理。可是这种角色管理太死板,不利于扩展。我们常常是用sql server或oracle等数据库保存用户信息和角色,这正是我们要讨论的核心,怎样用自己的数据库实现角色管理。

首先,我们看下forms的基本原理:

一,身份验证

要采用forms验证,先要在应用程序的web.config中进行设置

<anthentication mode="forms">

    <forms name=".aspnet" loginurl="/default.aspx" protection="all" timeout="30" path="/">

</anthentication>

其中<anthentication mode="forms">表示验证方式是表单,<forms>中的name表示身份验证的httpcookie的名字。采用这种方式验证后的用户,已此用户的信息建立一个formsAuthenticationTicket类型的身份验证票据,再序列化为一个字符串,最后将这个字符串写入到客户端的cookie中。一旦信息写入cookie,以后每次客户端向服务器发送信息都会将cookie一起发送,这样我们就可以在服务器分析cookie中的信息,确定身份,当然还有角色。

    好我们仔细看下FormsAuthenticationTicket都包含哪些信息呢:

public FormsAuthenticationTicket(int version,string name,datetime issuedate,datetime expiration,bool ispersistent,string userdata,string cookiepath)

cookiepath:返回发出的cookie路径。注意窗体的路径设置为 / 。由于窗体区分大小写,这是为防止站点中URL的大小写不一致而采取的一种保护措施。这在刷新cookie时有用

Expriation:获取cookie的过期时间

IsPersistent:如果已发出持久的cookie,则返回true。否则身份验证cookie将限制在浏览器生命周期内。

IssueDate:获取最初发出cookie的日期和时间。

Name:获取与身份验证cookie关联的用户名。

UserDate:获取存储在cookie中应用程序定义字符串。(这个字段正是我们的关键)

version:返回字节版本号供将来使用。

<forms>中loginurl指定如果没有找到任何有效的身份验证cookie,则页面将重定向到这个页面,实现登录。一般这个页面就是一个用户名和密码的表单,通过数据库查询进行核对用户信息。并通过formsauthentication.redirectfromloginpage方法来完成身份验证票写回客户端,浏览器重定向等操作。

public  static void redirectfromloginpage( string username,bool createpersistentcookie, string strcookiepaht);

其中username:就是此用户的标示,用来标示此用户的唯一标识,不一定要映射到用户的帐号名。

createpersistentcookie:标示是否发出持久的cookie。

如不是持久的cookie,cookie的有效期就是Expiration属性加上web.config中timeout。持久的就是50年,每次用户请求时,会判断是否过了有效期的一半,若是就更新cookie的有效期。

strcookiepath:标示将生成的cookie写入到客户端的路径,若没有strcookiepath参数,则使用web.config中的path设置。

这里可以看到,此方法只有三个参数,而身份验证票有七个属性,不足的四个参数是这么来的:

IssueDate:cookie发出时间由当前时间得出,

expiration:过期时间由当前时间和timeout时间算出。

userdata:这个属性可以用应用程序写入一些用户自定义的数据,此方法没有这个属性,只是简单的将数据设置为空,不过注意,在后面我们要用到这个属性。

varsion:版本号由系统自动提供

redirectfromloginpage方法生成身份验证票后,会调用formsauthentication.encrypt方法,将身份验证票加密为字符串,这个字符串将是.aspnet为名的cookie的值。

 

访问授权

验证了身份,要是使用这个身份,根据不同的身份我们可以进行不同的操作,处理,最常见的就是对不用的身份进行不同的授权。forms授权是基于目录的,在WEB.CONFIG中可以这样设置

<authorization>

    <allow users="" roles="" verbs=""/>

    <deny users="" roles="" verbs=""/>

</authorization>

allow表示允许,deny表示拒绝

users表示分隔的用户

rolse表示角色

verbs表示http的传输方法,如get,post等

若属性中出现*,如users=“*”表示所有用户,users=“?”表示匿名用户

下面看下user和role的详细过程:

1,一旦一个用户访问了网站,就进行了身份确认,身份验证票就写入了客户端。之后,这个用户每次申请web页面,具有身份验证票的cookie就会发送到服务器。在服务器端,ASP.NET对每个http请求都分配一个httpapplication对象来处理这个请求,在

httpapplication.authenticationrequest事件后,安全模式已建立了用户标识,就是此用户的身份在web端已建立起来,这个身份完全是由客户端发送来的身份验证票的cookie建立的。

2,用户身份存在于httpcontext.user属性中,在页面中可以通过page.context来获取httpcontext对象。对于forms验证,httpcontext.user属性是一个genericPrincipal类型的对象,genericPrincipal只有一个公开的属性identity,有一个私有的属性m_role属性,是string【】类型,存放此用户是属于那些role的数组,还有一个公开的方法isinrole( string role),来判断此用户是否属于这个角色。由于身份验证票的cookie中根本没提供这个role属性,就是说forms身份验证票没有提供此用户的role信息,所以,对forms验证,在服务器端得到的genericPrincipal用户对象的m_role属性永远是空的。

3,genericPrincipal.identity属性是一个formsidentity类型的对象,这个对象有个name属性,就是此用户的标识,访问授权是将这个属性做为user类进行授权验证的。formsidentity还有一个属性,就是ticket属性,此属性是身份验证票formsauthenticationticket类型,就是之前服务器写到客户端的身份验证票。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值