站点地图与权限:Sitemap and Role

上周在做个项目时涉及到用户权限的设计,折腾了半天,脑袋整晕之后终于明白——该吃饭了......

我们知道不同的用户登录网站后享受的是不同的待遇。这个“用户”又分为“匿名用户”和“注册用户”。匿名用户一般看到的是公共的一些信息,随便看。但是遇到一些页面就不行了,必须注册成“注册用户”才行。而不同的注册用户你可能也要给他们分个类别,比如什么销售人员只能看销售相关的页面啊,采购人员只能看采购方面的页面啊,财务人员只能看财务方面的页面啊,等等......

这时候就要分“角色”了。

“角色”让注册用户有所归属。这样你在分配权限的时候就只需要给角色分配就好了。但是你可能会问:我想给销售人员看财务方面的页面呢,怎么办?OK,这就要单独给他加个权限了。这也就是为什么下面会出现2个web.config文件的原因了。

涉及到网站权限的文件有这么几个:

  1. Web.sitemap 站点地图。可以控制你的导航菜单的显示和隐藏。
  2. web.config(站点根目录下)整个网站的配置文件。这家伙可厉害了!控制网站验证方式、授权方式、成员管理、角色管理......
  3. web.config(相关网页所属的文件夹下)文件夹里的网页的配置文件。它的作用就比较细化了,可以控制用户能否访问到某个页面的权限。

大致总结了下,启用网站的权限管理一般就用到这3个文件。

web.sitemap管菜单是否显示,显示了能否有权限访问却不一定,还要配合web.config。就算不显示,只要web.config里没有配置相应权限,那个隐藏的页面也是可以访问的。

web.config管理权限,就算导航菜单显示了菜单,如果设置拒绝的权限,依然也只是”可远观而不可点击也“。

所以web.sitemap和web.config要配合起来一起用!

上代码!

<!--文件:Web.sitemap(控制导航菜单的显示和隐藏)-->
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode title="Home" roles="*"><!--此处设置roles="*",母版中的menu才会显示出来! -->
<siteMapNode title="物料数据维护" roles="Administrator,Produce,*" ><!--此处在roles中加入"*",可让所有角色的用户都看到此菜单,但却不一定有权限进行操作(除非在相应文件夹里的web.config里赋予权限。 -->
<siteMapNode url="~/Produce/MaterialCreat.aspx" title="创建物料"/>
<siteMapNode url="~/Produce/MaterialChange.aspx" title="更改物料"/>
</siteMapNode>
<siteMapNode title="预测计划" roles="Administrator,Market,*"><!--Produce角色的用户本来是看不到这个菜单的,但是加入"*"就可以看到了,只是还不一定有权限。 -->
<siteMapNode url="~/Market/AddIndRq.aspx" title="创建预测计划" description=""/>
<siteMapNode url="~/Market/InputIndRq.aspx" title="创建预测计划-批输入"/>
<siteMapNode url="~/Market/ChangeIndRq.aspx" title="更改预测计划" description=""/>
<siteMapNode url="~/Market/ShowIndRq.aspx" title="查看预测计划"/>
<siteMapNode url="~/Market/Publish.aspx" title="发布预测计划"/>
</siteMapNode>
<siteMapNode url="~/Supply/MRP.aspx" title="物料需求(MRP)" roles="Administrator,Supply,Produce,*"/>
</siteMapNode>
</siteMap>

网页的title只是举例,看结构吧。

下面是站点根目录下的web.config,内容较多。主要涉及到2个数据库连接,3个defaultProvider。

<!--文件:web.config(站点根目录下)-->
<configuration>
<connectionStrings>
<add name="nsnCS" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=NSN;User ID=sa;Password=sa" providerName="System.Data.SqlClient"/>
<add name="nsnRole" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=NSN_Role;User ID=sa;Password=sa" providerName="System.Data.SqlClient"/>
</connectionStrings>

<system.web><!--注意节点! -->
<!--验证方式-->
<authentication mode="Forms" >
<forms loginUrl="Login.aspx" timeout="60"/>
</authentication>

<!--授权-->
<authorization>
<allow users="?" /><!--允许匿名访问-->
</authorization>

<!--成员管理-->
<membership defaultProvider="myMBS" userIsOnlineTimeWindow="20">
<providers>
<add
name="myMBS"
type
="System.Web.Security.SqlMembershipProvider"
connectionStringName
="nsnRole"
enablePasswordRetrieval
="false"
enablePasswordReset
="true"
requiresQuestionAndAnswer
="false"
requiresUniqueEmail
="false"
passwordFormat
="Clear"
applicationName
="/"
maxInvalidPasswordAttempts
="5"
minRequiredPasswordLength
="3"
minRequiredNonalphanumericCharacters
="0"
passwordAttemptWindow
="10"
passwordStrengthRegularExpression
=""
/>
</providers>
</membership>

<!--启用角色-->
<roleManager enabled="true" defaultProvider="myRole" >
<providers>
<add
name="myRole"
connectionStringName
="nsnRole"
type
="System.Web.Security.SqlRoleProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
applicationName
="/"
/>
</providers>
</roleManager>

<!--启用安全修整-->
<siteMap defaultProvider="myprovider" enabled="true">
<providers>
<add
name="myprovider"
type
="System.Web.XmlSiteMapProvider"
siteMapFile
="web.sitemap"
securityTrimmingEnabled
="true"
/>
</providers>
</siteMap>
</system.web>
</configuration>


最后是文件夹下的web.config,控制文件夹及文件夹里的单个网页。

<!--文件:Market/web.config(roles控制权限)-->
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<authorization>
<allow roles="Administrator,Market" />
<deny users="*" /><!--此处设置roles="*",才会将其他角色的用户拒之门外! -->
</authorization>
</system.web>

<location path="ShowIndRq.aspx"><!--Market文件夹里的单个网页设置权限 -->
<system.web>
<authorization>
<allow roles="Produce"/><!--Produce角色的用户即可以看到菜单,也获得了操作的权限。 -->
</authorization>
</system.web>
</location>
</configuration>


【摘录】可以将 SqlRoleProvider 配置为与 SqlMembershipProvider 使用相同的数据库和用户信息,以便使用一个数据库即可获得身份验证和授权信息。如要使用同一个数据库获取成员资格和角色信息,请运行 aspnet_regsql.exe 可执行文件,然后安装成员资格功能。然后,在配置中为 SqlRoleProvider 和 SqlMembershipProvider 实例指定同样的连接字符串。另外,还要确保利用相同的 ApplicationName 来配置这两个提供程序实例。

打完收工!

posted @ 2012-04-04 12:45  ibg  阅读(681)  评论(0编辑  收藏  举报