一、概述
如果按照第二篇的来操作,你会发现membership的配置都是在ASP.NET配置工具中完成的,主要做了三件事情:
1.设置提供程序Provider
2.设置连接字符串ConnectionString
3.设置验证方式,访问规则等
完成之后,查看web.config文件,可以发现多了一些内容:
<connectionStrings><!--连接字符串-->
<remove name="OraAspNetConString" />
<add connectionString="DATA SOURCE=ORCLL;PASSWORD=tiger;PERSIST SECURITY INFO=false;USER ID=SCOTT" name="OraAspNetConString" />
</connectionStrings>
<roleManager enabled="true" defaultProvider="OracleRoleProvider" /><!--角色提供程序-->
<membership defaultProvider="OracleMembershipProvider" /><!--成员资格提供程序-->
<authentication mode="Forms" ><!--验证方式-->
以上内容其实都可以在web.config文件中进行设置,而且除了连接字符串和角色提供程序,其它的可以更加详细的定制。
二、主要内容
1.设置提供程序
<system.web>
<membership defaultProvider="OracleMembershipProvider">
<providers>
<add name="OracleMembershipProvider"
type="Oracle.Web.Security.OracleMembershipProvider, Oracle.Web, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"connectionStringName="OraAspNetConString"
applicationName=""
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
上面使用defaultProvider属性指明本网站使用哪个配置。
上面的结点可以在machine.config中找到,在C:\WINDOWS\Microsoft.NET\Framework\版本号\CONFIG\machine.config这个文件,找到system.web节点下的membership节点,将OracleMembershipProvider部分复制到我们新建网站的web.config中的system.web节点中修改就可以了。
下面是主要的几个属性的含义:
name:数据提供程序的名称。
type:数据提供程序类型。
connectionStringName:该属性必须指定在<connectionStrings>节点中,一个连接字符串的名字。
applicationName:应用程序名称,membership允许多个应用程序共同使用一个数据库来管理自己的用户、角色信息,各应用程序只需配置不同的applicationName即可,当然,如果想要多个应用程序使用同一份用户角色信息,只需设置一样的applicationName即可。
requiresUniqueEmail:顾名思义,用户注册时,是否需要提供未注册过的邮箱。
passwordFormat:密码存储格式,密码保存在数据库中的格式,最常用的有Clear(不加密)和Hashed(使用SHA1算法加密)
minRequiredPasswordLength:最小密码长度。
minRequiredNonalphanumericCharacters:指定有效密码中必须包含的特殊字符的最小数量,就是说不是字母也不是数字的字符的数量,比如+-*/,.什么的,增加密码强度。这个一般设为0即可。
2.设置连接字符串
在web.config的configuration-connectionStings下面添加刚才注册数据库的连接字符串:
<connectionStrings>
<remove name="OraAspNetConString" />
<add connectionString="DATA SOURCE=ORCLL;PASSWORD=tiger;PERSIST SECURITY INFO=false;USER ID=SCOTT" name="OraAspNetConString" />
</connectionStrings>
3.配置验证方式
配置Forms身份验证:
< authentication mode ="Forms" >
< forms loginUrl ="Login.aspx"
protection ="All"
timeout ="30"
name =".ASPXAUTH"
path ="/"
slidingExpiration ="true"
defaultUrl ="default.aspx"
cookieless ="UseDeviceProfile" />
</ authentication >
</ system.web >
需要说明一下的是LoginUrl和DefaultUrl属性:LoginUrl指向登录页面,当ASP.NET判断出该用户请求的资源不允许匿名访问,而该用户未登录时,ASP.NET会自动跳转到LoginUrl所指向的页面,当登录成功后,则跳转回原来请求的页面。DefaultUrl指向默认页面。当我们直接访问登录页面,并登录成功后,这时ASP.NET会跳转到DefaultUrl指向的页面。其他的选项不写都可以,因为有默认值。其它属性的具体含义可以参考MSDN。
sitemap结合角色管理提供授权服务(番外篇):
ASP.NET配置工具还可以创建用户,角色和配置访问规则,其中访问规则同样可以在web.config中进行配置,规模不大的web应用可以采用这种做法,具体做法可以参考以下链接:http://www.cnblogs.com/xlb2000/archive/2010/05/12/1733514.html,里面讲解了基于用户和基于角色两种授权方式的配置,可以做到目录一级和页面一级的访问控制。当页面很多时,这种做法就不可取了。我们这里采用的方式是和sitemap结合起来提供授权服务,好处是可以轻松的做到基于角色的页面一级的访问控制,并且扩展型很好。具体做法如下:
1.在Web服务器上安装Oracle ODAC,在Oracle数据库中运行ODAC的aspnet的脚本,并在该Web服务器上配置machine.config中的OraAspNetConString连接字符串。如果注册了membership机制,这一步就已经做了。
2.在web.config文件的system.web节中增加:
<siteMap defaultProvider="MY_OracleSiteMapProvider">
<providers>
<clear/>
<add name="MY_OracleSiteMapProvider" type="myOracleSiteMapProvider" securityTrimmingEnabled="true" connectionStringName="OraAspNetConString" applicationName="/WebSite3" />
</providers>
</siteMap>
说明:
(1)、connectionStringName="OraAspNetConString"使用的是之前建好的连接字符串。
(2)、 applicationName="/WebSite3 "中的值,应与ORA_ASPNET_APPLICATIONS表中的APPLICATIONNAME字段的值一致。
(3)、 type="myOracleSiteMapProvider"中的值,是需要自己继承OracleSiteMapProvider并实现的类。
(4)、把页面中的SiteMapDataSource控件的SieMapProvider设置为:MY_OracleSiteMapProvider
这样就设置好了sitemap的提供程序。当然,这现在还是个空架子,需要自己继承OracleSiteMapProvider,并实现IsAccessibleToUser方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using Oracle.Web.SiteMap; // 手动添加,需将Oracle.Web.dll添加至bin目录中!
public class myOracleSiteMapProvider : OracleSiteMapProvider
{
public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node)
{
//If Security Trimming is not enabled return true
if (!SecurityTrimmingEnabled)
return true;
//该节点的没有定义roles定义时,则为 (node.Roles == null || node.Roles.Count == 0)的情形,表示任何用户(含匿名用户)均可访问
if (node.Roles == null || node.Roles.Count == 0)
return true;
//检查角色
foreach (string role in node.Roles)
{
if (Roles.IsUserInRole(role))
return true;
}
// 视对roles=*理解为是否含匿名用户而取舍,如果认为roles=* 包括匿名用户,则注释到下面1条语句(if (context.User.Identity.IsAuthenticated)) // 一般认为roles=* 不包括匿名用户,role=空 则包括匿名用户。
if (context.User.Identity.IsAuthenticated)
foreach (string role in node.Roles)
{
if (String.Equals(role, "*", StringComparison.InvariantCultureIgnoreCase))
return true;
}
return false;
}
}
</pre><p></p><pre>
这样sitemapProvider的配置就算完成了,可以在页面中使用menu,treeview等控件,并实现访问控制。
以上是sitemap与web.config关于授权的不同做法,这里sitemap的用法与平时的用法也不同。平时都是使用sitemap文件作为数据源,menu,treeview使用sitemapdatasource作为中间层与sitemap通信。这里使用的是Oracle中的sitemap表作为数据源,并自己实现了SitemapProvider提供程序。menu,treeview使用sitemapdatasource作为中间层,通过SitemapProvider与数据库进行通信,如图所示: