上次讨论了用户"认证"管理,也就是讨论了"你是谁?"的问题,(.NET 2.0下实现匿名用户向注册用户的迁移)那么今天来讨论用户"授权"管理,也就是"我已经知道你是谁,你想干什么?"的问题。说白了,上次讨论的是用户管理,这次讨论权限管理,而且是利用自定义数据库的用户和权限管理。
先来看如果配置自定义数据库 默认情况下,ASP.NET 2.0对成员或权限管理都是利用上篇介绍的自动生成的数据库(ASPNETDB)来管理,这样缺乏灵活性,因为这样的数据库不是一个实例数据库,那么我们先来看看怎么创建自定义数据库。
1.在Sql 2005下通过下图方式创建一个自定义数据库以及建立好的数据库如下两图:
注意:本机是采用Window认证方式进入数据库的,具体登录方式自己灵活设定
这个数据库用来取代 上述ASPNETDB,建好一个空库后如图,本数据库取名为:
ProfileDB,注意:此时该数据库下一个表都没有
在C盘符下搜索Aspnet_regsql.exe这个命令文件, 本人机器得到的目录如下:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 , 在"开始"-->"运行"中输入"cmd"进入DOS命令行方式,在上述目录下敲入Aspnet_regsql.exe这个命令,如果不带任何参数,那么会带我们进入"Sql Server安装向导",如下图所示:
单击"下一步"--->"下一步",开始选择服务器和数据库,那么我们选择刚建立好的数据库,由于我们是Window方式登录数据库的,那么选择数据库ProfileDB如下图:
陆续单击"下一步"--->"下一步"--->"完成",那么就完成自定义数据库的创建,那么此时空数据库就有如下图所示的表了,
web.config
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<appSettings/>
<connectionStrings>
<add name="NorthwindConnectionString" connectionString="Data Source=ROGER;Initial Catalog=Northwind;Integrated Security=True" providerName="System.Data.SqlClient"/>
<add name="ProfileConnectionString" connectionString="Data Source=ROGER;Initial Catalog=ProfileDB;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<!--> anonymousIdentification 配置节针对应用程序授权配置匿名标识。这是在需要授权时,
对没有经过身份验证的实体进行标识所必需的。详细说明见如下地址:
http://msdn.microsoft.com/zh-cn/library/91ka2e6a(VS.80).aspx
-->
<anonymousIdentification cookieless="AutoDetect" enabled="true"/>
<profile defaultProvider="ProfileConnection">
<providers>
<add name="ProfileConnection"
connectionStringName="ProfileConnectionString" applicationName="/"
type="System.Web.Profile.SqlProfileProvider,System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
<properties>
<add name="ShoppingCart" type="ShoppingCart" serializeAs="Binary" allowAnonymous="true"/>
</properties>
</profile>
<authentication mode="Forms">
<forms loginUrl="Login.aspx"></forms>
</authentication>
<compilation debug="true"/>
</system.web>
</configuration>其实我们可以发现,这些表就是数据库ASPNETDB.mdf下的表,只不过现在才一个实例数据库ProfileDB下了。
那么今后我们在这个网站下建立的所有用户个性信息在上面这些表中都能找到的。
2. 修改Web.config配置节
修改后的配置节如下代码:
web.config
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<appSettings/>
<connectionStrings>
<add name="NorthwindConnectionString" connectionString="Data Source=ROGER;Initial Catalog=Northwind;Integrated Security=True" providerName="System.Data.SqlClient"/>
<add name="ProfileConnectionString" connectionString="Data Source=ROGER;Initial Catalog=ProfileDB;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<!--> anonymousIdentification 配置节针对应用程序授权配置匿名标识。这是在需要授权时,
对没有经过身份验证的实体进行标识所必需的。详细说明见如下地址:
http://msdn.microsoft.com/zh-cn/library/91ka2e6a(VS.80).aspx
-->
<anonymousIdentification cookieless="AutoDetect" enabled="true"/>
<profile defaultProvider="ProfileConnection">
<providers>
<add name="ProfileConnection"
connectionStringName="ProfileConnectionString" applicationName="/"
type="System.Web.Profile.SqlProfileProvider,System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
<properties>
<add name="ShoppingCart" type="ShoppingCart" serializeAs="Binary" allowAnonymous="true"/>
</properties>
</profile>
<authentication mode="Forms">
<forms loginUrl="Login.aspx"></forms>
</authentication>
<compilation debug="true"/>
</system.web>
</configuration>请注意黄色高亮显示部分是我们需要加入的配置节内容,那么Providers配置节就是定义自定义数据库的地方,并且在Profile中需要加入使用Provider的声明,注意上述绿色粗体部分名字要一样.
此时在该数据库中使用下述命令查询是没有结果的:
--Profile
select userid,propertyNames,propertyvaluesstring,lastupdateddate
from aspnet_profile
order by lastupdateddate desc
--users
select userid,username,lastactivitydate
from aspnet_users
order by lastactivitydate desc
下面再次运行default.aspx,不要登录,那么就退出,再次查看上述两个命令,发现会出现匿名用户登录的信息,
由此我们看到匿名用户也会得到一个唯一的userid,而此匿名用户未登录的购物车信息会出现在propertyName字段中,就是因为配置节中
<properties>
<add name="ShoppingCart" type="ShoppingCart" serializeAs="Binary" allowAnonymous="true"/>
</properties>
引起的记录,其中type=="ShoppingCart" 映射到自定义的类ShoppingCart ,serializeAs="Binary" 表示此类可以序列化,allowAnonymous="true"表示匿名用户可以访问.
接下来再次运行default.aspx并进入登录界面,并用界面提示的Tom用户和密码登录也是成功的,因为此时数据库已经由自动的ASPNETDB转换到了自定义数据库ProfileDB上了.并且登录成功后,用上面红色部分的命令再次查看数据库,发现此时结果有变化:
上面的结果表明:无论注册用户还是匿名用户都有自己唯一的userid,并且都是独立的.
注意: aspnet_profile表是用户个性信息的存储地方,上面两幅图片看出结果比较,此时在这个表上产生的结果已经由第一副图的匿名用户userid迁移到注册用户userid上来了. 注意看两幅图第一个结果集的userid的变化,而且两个结果集是通过userid来关联的.并且第二个结果集上以及多出了注册用户的信息.
接着如果用匿名用户登录default.aspx页面,并试着将商品放入购物车:
那么再次用注册用户登录后,发现仍然有该购物车的信息,这就是在自定义数据库中实现用户迁移.如上下两 张图片的比较.注意"当前用户"的区别.
接下来看下面一个主题:实现角色管理
上面实现的是用户管理,还没有涉及到权限,并且由上篇的网站管理图片可以看到,如果没有设置权限,那么当前角色是没有的,那么我们进行如下的Web.config配置设置:
web.config
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<appSettings/>
<connectionStrings>
<add name="NorthwindConnectionString" connectionString="Data Source=ROGER;Initial Catalog=Northwind;Integrated Security=True" providerName="System.Data.SqlClient"/>
<add name="ProfileConnectionString" connectionString="Data Source=ROGER;Initial Catalog=ProfileDB;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<sessionState cookieless="AutoDetect"/>
<roleManager enabled="true" cacheRolesInCookie="true" cookieName="PROFILEROLES" defaultProvider="ProfileConnection">
<providers>
<add connectionStringName="ProfileConnectionString" applicationName="/" name="ProfileConnection" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
<!--> anonymousIdentification 配置节针对应用程序授权配置匿名标识。这是在需要授权时,
对没有经过身份验证的实体进行标识所必需的。详细说明见如下地址:
http://msdn.microsoft.com/zh-cn/library/91ka2e6a(VS.80).aspx
-->
<anonymousIdentification cookieless="AutoDetect" enabled="true"/>
<profile defaultProvider="ProfileConnection">
<providers>
<add name="ProfileConnection"
connectionStringName="ProfileConnectionString" applicationName="/"
type="System.Web.Profile.SqlProfileProvider,System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
<properties>
<add name="ShoppingCart" type="ShoppingCart" serializeAs="Binary" allowAnonymous="true"/>
</properties>
</profile>
<authentication mode="Forms">
<forms loginUrl="Login.aspx"></forms>
</authentication>
<compilation debug="true"/>
</system.web>
</configuration>注意天蓝色代码是我们新加入的,<roleManager>配置节和<Profile>类似,也需要制定自定义的数据库,因此也有 <providers>节点,具体其他设置和<Profile>一样,那么现在像上篇那样打开网站设置页面如图:
此时发现已经启用角色管理了,但还没有创建角色,接着分别按照按照界面提示"创建或管理角色"按钮以及"创建用户按钮和"管理用户按钮",分别创建如下的两个用户和两个角色,并将两个用户赋予各自的角色,如Tom分配Admin角色,Jack分配Common角色,如图:
切记一定要为上述两个用户分别配置一个角色.
接着在在网站根目录下建立一个页面Test.aspx,再建一个目录Admin,就是放一些需要admin角色才能进入的页面,比如建立刚建立的页面Manager.aspx,并且在此目录下建立自己的Web.config文件,最后在根目录下Default.aspx中再建立两超链接,分别链接到Test和Manager页面上,如下图:
那么此时我们的需求是:当用户Tom登录后,他可以访问任何页面,而Jack登录后,只能访问Default.aspx和Test.aspx而不能访问Manager.aspx页面.下面我们这么做:
1. 先修改Admin目录下的web.config,如下:
web.config
<?xml version="1.0" encoding="utf-8"?>
<!-- 注意: 除了手动编辑此文件以外,您还可以使用 Web 管理工具来
配置应用程序的设置。可以使用 Visual Studio 中的“网站”->“ASP.NET 配置”
选项。
设置和注释的完整列表在
machine.config.comments 中,该文件通常位于 \Windows\Microsoft.NET\Framework\v2.0.xxxxx\Config 中
-->
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<authorization>
<allow roles="Admin,Common" />
<deny users="*" />
</authorization>
</system.web>
<location path="Manager.aspx">
<system.web>
<authorization>
<allow roles="Admin" />
<deny users="*" />
</authorization>
</system.web>
</location>
</configuration>注意:黄色高亮显示的是新加入的配置节,分别设定整个目录的访问角色权限以及具体针对哪个页面的角色限定,其余部分比较简单,这里就不讲解了.
那么此时用Jack和Tom两个用户身份在Default页面分别去访问Admin下的页面Manager.aspx得到的结果是不一样的,这样角色管理也可以实现了.
总结并扩展:其实上面两篇文章介绍的方式还是不够完整的,比如没有完全灵活的针对角色进行管理,也就是角色和权限的绑定.对独立权限的设定支持不够,独立权限在某些方面很有用,定义一个权限列表,将它们赋予一个角色,接着在角色中添加用户,然后就可以在代码中测试用户具有该权限,而不需要检测用户是否属于某个角色.而上述操作还没有用API代码实现,而是在ASP.NET网站配置中设计的,因此还可以对上述数据库中的各种表进行管理,以实现上述功能,当然是用代码实现的,这就是我们为什么建立自定义数据库的原因,因为我们扩展的时候是需要操纵它的.