本次实验的目的是使同学们掌握 membership 配置,并能够灵活应用。首先对 web.config 中如何进行配置进行了详细的介绍;最后面通过一个选择不同部门来对应不同提供程序的小实验,不仅练习了上一章学习的控件模板的引用而且加深了对 membership 的理解。
1.添加数据库支持
要使用 membership 首先需要数据库的支持,所以我们第一步就是创建用来存放用户、角色等信息的表结构。别担心,MS 早就把创建表的语句写好了,并且还提供了用户界面,让我们点点鼠标就可以创建好所需的结构了。
具体操作如下:进入 C:\WINDOWS\Microsoft.NET\Framework\v4.0.xxxxx(vs2010 的目录是v4.0.xxxx)这个目录下,找到 aspnet_regsql.exe 直接双击运行,就会弹出一个界面,直接下一步。第二个界面让我们选择是添加表结构还是移除,我们当然选择添加,继续下一步。在这个界面中需要填写服务器 ip 地址以及身份验证信息。在填写完毕后,就可以选择你要将表结构添加到哪个数据库中了。需要注意的是:如果选择默认,则会创建一个新的名叫 aspnetdb 的数据库,然后将表结构加入其中。一路下一步就完成了数据库结构的添加。
在开始程序中打开 vs 的开发人员命令提示,输入以下命令:
aspnet_regsql.exe -E -S localhost -A mr
通过该命令,为数据库添加 meimbership 相关功能。
2.web.config 配置
接下来就是需要在项目中进行一些简单的配置了。
我们先建立一个解决方案。
随后再用记事本打开C:\WINDOWS\Microsoft.NET\Framework\v4.0.xxxxx\CONFIG\machine.config 这个文件,找到system.web 节点下的 membership 节点,将整个节点复制到我们新建网站的 web.config 中的
system.web 节点中。
system.web 节点中。
复制过来的代码如下:
<membership>
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
下面是主要的几个属性的含义:
name:数据提供程序的名称,由于我们是从 machine.config 复制过来的,所以必须改名,防止重名。
type:数据提供程序类型,如果使用的是 MSSQL 数据库,则保持不变即可,如果使用的是 Oracle等其他数据库,则必须自己创建一个类来继承 MembershipProvider 抽象基类,重写里边的所有抽象方法,然后把类型写在这里即可。
connectionStringName:该属性必须指定在<connectionStrings>节点中,一个连接字符串的名字。
enablePasswordRetrieval:获取一个值,指示 SQL Server 成员资格提供程序是否配置为允许用户检索其密码。如果 PasswordFormat 属性设置为 Hashed,用户将无法从数据库检索其现有密码。Hashed 密码格式提供密码值的单向编码。密码使用随机生成的 salt 值进行哈希计算,并与存储在数据库中的值比较以进行身份验证。无法通过对哈希值进行解码获得原始密码值。如果 PasswordFormat 属性设置为 Hashed 并且 EnablePasswordRetrieval 设置为 true,则初始化提供程序时会引发一个 ProviderException。
ProviderException 类:当发生配置提供程序错误时引发的异常。如果提供程序内发生的内部错误没有映射到其他已存在的异常类,则提供程序也使用此异常类来引发异常。
EnablePasswordReset:如果成员资格提供程序支持密码重置,则为 true;否则为 false。默认为 true。密码重置允许成员资格提供程序以随机生成的新密码更换用户名的当前密码。
RequiresQuestionAndAnswer:指示 SQL Server 成员资格提供程序是否配置为要求用户在进行密码重置和检索时回答密码提示问题。
applicationName:应用程序名称,membership 允许多个应用程序共同使用一个数据库来管理自己的用户、角色信息,各应用程序只需配置不同的 applicationName 即可,当然,如果想要多个应用程序使用同一份用户角色信息,只需设置一样的 applicationName 即可。
requiresUniqueEmail:顾名思义,用户注册时,是否需要提供未注册过的邮箱。
passwordFormat:密码存储格式,密码保存在数据库中的格式,最常用的有 Clear(不加密)和 Hashed(使用 SHA1 算法加密)。
MaxInvalidPasswordAttempts:获取锁定成员资格用户前允许的无效密码或无效密码提示问题答案尝试次数。
minRequiredPasswordLength:最小密码长度。
minRequiredNonalphanumericCharacters:指定有效密码中必须包含的特殊字符的最小数量,就是说不是字母也不是数字的字符的数量,比如+-*/,.什么的,增加密码强度。
passwordAttemptWindow:获取在锁定成员资格用户之前允许的最大无效密码或无效密码提示问题答案尝试次数的分钟数。
passwordStrengthRegularExpression:获取为对象验证密码复杂性而使用的正则表达式。
接下来,我们将配置修改一下并添加连接字符串:
<connectionStrings>
<add name ="ConnectionString" connectionString="Integrated Security=sspi;server=.;database=aspnetdb;connect timeout=30"/>
</connectionStrings>
<system.web>
<membership defaultProvider ="mySqlMembershipProvider">
<providers>
<add name="mySqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="ConnectionString"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="TestMembership"
requiresUniqueEmail="true"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
</system.web>
上面标注出来的属性,是为了告诉 membership 采用我们刚才添加的mySqlMembershipProvider 这个配置,因为 machine.config 中有一个AspNetSqlMembershipProvider,我们又在 web.config 中又添加了一个
mySqlMembershipProvider,现在有了两个配置,所以应该使用 defaultProvider 属性指明本网站使用哪个配置。随后又指定了连接字符串配置的名称,一个 Email 不允许重复注册,最小密码长度
为 6,不限制密码中必须含有标点符号等配置。
3.ASP.NET 身份验证配置
membership 算是配置到这里了,但是还没有结束,我们还需要把 ASP.NET 的身份验证机制配置为 Forms 身份验证。
PS:ASP.NET 一共有三种身份验证方式,分别为: 1. Forms 验证 2. Windows 验证 3. Passport 验证 1.Windows 验证是一种把能够访问到 IIS 的用户认为是已经通过身份验证的用户。可以通过windows 自带的身份验证策略来控制哪些页面用户可以访问,哪些不能访问。这是一种最简单的方式,基本不用写多少代码,全部通过配置就可以实现访问的控制。 2.Passport 验证是由微软提供身份验证服务。当然这是收费的。 3.Forms 验证就是在用户登录时,向浏览器中添加一个 cookie,然后在用户每次访问时都检测这个 cookie,从而达到身份验证的目的。
配置 Forms 身份验证其实就是把下面代码复制到 web.config 中去就可以了:
<system.web>
<authentication mode="Forms">
<forms loginUrl="Login.aspx"
protection="All"
timeout="30"
name=".ASPXAUTH"
path="/"
slidingExpiration="true"
defaultUrl="default.aspx"
cookieless="UseDeviceProfile"/>
</authentication>
</system.web>
下面是说明(来源 msdn): loginUrl 指向应用程序的自定义登录页。应该将登录页放在需要安全套接字层 (SSL) 的文件夹中。这有助于确保凭据从浏览器传到 Web 服务器时的完整性。
protection 设置为 All,以指定窗体身份验证票的保密性和完整性。这导致使用 machineKey 元素上指定的算法对身份验证票证进行加密,并且使用同样是 machineKey 元素上指定的哈希算法进行签名。
timeout 用于指定窗体身份验证会话的有限生存期。默认值为 30 分钟。如果颁发持久的窗体身份验证 Cookie,timeout 属性还用于设置持久 Cookie 的生存期。
name 和 path 设置为应用程序的配置文件中定义的值。 name:指定要用于身份验证的 HTTP Cookie。如果正在一台服务器上运行多个应用程序并且每个应用程序都需要唯一的 Cookie,则必须在每个应用程序的 Web.config 文件中配置 Cookie 名称。默认值为 ".ASPXAUTH"。"。 path:为应用程序发出的 Cookie 指定路径。默认值是斜杠 ( /),这是因为大多数浏览器是区分大小写的,如果路径大小写不匹配,浏览器不会送回 Cookie。
requireSSL 设置为 false。该配置意味着身份验证 Cookie 可通过未经 SSL 加密的信道进行传输。如果担心会话窃取,应考虑将 requireSSL 设置为 true。
slidingExpiration 设置为 true 以执行变化的会话生存期。这意味着只要用户在站点上处于活动状态,会话超时就会定期重置。
defaultUrl 设置为应用程序的 Default.aspx 页(定义在身份验证之后用于重定向的默认 URL)。
cookieless 设置为 UseDeviceProfile,以指定应用程序对所有支持 Cookie 的浏览器都使用 Cookie。如果不支持 Cookie 的浏览器访问该站点,窗体身份验证在 URL 上打包身份验证票。
enableCrossAppRedirects 表明是否将通过身份验证的用户重定向到其他 Web 应用程序中的 URL。默认值为 False。
需要说明一下的是 LoginUrl 和 DefaultUrl 属性:LoginUrl 指向登录页面,当 ASP.NET 判断出该用户请求的资源不允许匿名访问,而该用户未登录时,ASP.NET 会自动跳转到 LoginUrl 所指向的页面,当登录成功后,则跳转回原来请求的页面。DefaultUrl 指向默认页面。当我们直接访问登录页面,并登录成功后,这时 ASP.NET 会跳转到 DefaultUrl 指向的页面。其他的选项不写都可以,因为有默认值。
至此,我们已经配置好一个可以连接到独立 SQLServer 数据库的 Web.config 文件。可以开始后面的工作了。