Oracle[转]ASP.NET 成员身价 Part.1(API)

本文转自:http://www.cnblogs.com/SkySoot/archive/2013/04/08/3008418.html

     表单验证解决了 ASP.NET
应用程序页面验证的题材,但一边,必须团结实现登录表单与底层的凭证存储之间的通信。对各级一个
WEB 程序来说,这些干活儿几乎都是一模一样的,非常单调。

       而且,表单验证就提供了认证用户之架构。如果您以一个自定义的信存储,就得自己写管理用户之管理应用程序,它当贯彻增长用户、删除用户、重设密码等力量。这又是一致错对于
Web 程序来说差不多的办事。

       ASP.NET 2.0 引入了成员身份 API,ASP.NET 4.0 保留了其。分子身份 API
是因现有的表单验证架构为根基的框架。

 

ASP.NET 成员身份 API 简介

       成员身价 API
框架提供了一整套完完全全的用户管理作用

  • 经过编程或者 ASP.NET 的 Web 配置工具来创造与去用户
  • 重置用户密码,还好活动发送密码重置邮件
  • 设用户通过后台程序创建,可以呢用户自动生成密码,还得将密码通过邮件自动发送给用户
  • 供了千篇一律密密麻麻预建控件创建登录页面、注册页面、显示登录状态、为证明了和不证明了的用户提供不同之视图
  • 经过成员身份提供程序类为应用程序提供了一个抽象层,以上有功能还可以无借助于底层的数据存储而完全独立工作。底层的数存储吗得于非欲修改程序的情景下,使用外类型的数码存储机制来替换。默认情况下,成员身份
    API 使用 SQL Server Express 数据库存储用户和角色信息

 

       成员身价 API 的布局(顺序也也层次关系)

  1. 平安控件:登录控件、密码控件、创建用户向导、状态控件
  2. 成员身价 API :Membership 类、[MembershipUser 类]
  3. 分子身份提供次:SQL Server
    提供程序、活动目录提供次、自定义的提供程序
  4. 成员身价存储:SQL Server、活动目录、自定义的储存 (例如,Oracle)

 

       成员身价 API
的计划性而该可了独立为它的底层数据存储来行事。作序的开发人员,主要就是暨 ASP.NET
提供的控件以及 Membership 类打交道。所有与成员身份 API
相关的类都受在了 System.Web.Security 命名空间中

成员身价 API 相关的切近:

Membership 这个类是和成员资格 API 交互的主要部分,它提供了一组方法来管理用户、验证用户以及重置用户密码
MembershipCreateUserException 当视图通过 Membership 类创建用户时,如果发生错误,会抛出一个异常
MembershipUser 代表一个存储在成员资格 API 凭证存储中的单独用户。包含此用户的所有信息,Membership 类有好几个方法返回此对象,例如 GetUser()
MembershipUserCollection 成员资格用户的集合,例如 Membership.GetAllUsers() 可以返回此对象
MembershipProvider 继承这个基类可以创建自定义的成员资格提供程序,这样就可以根据你自定义的凭证存储来验证用户了
MembershipProviderCollection 计算机以及 Web 应用程序的所有可用成员资格提供程序的集合
SqlMembershipProvider MembershipProvider 类的一个实现,与 SQL Server 数据库一同工作
ActiveDirectoryMembershipProvider MembershipProvider 类的一个实现,与活动目录一同工作
ActiveDirectoryMembershipUser 这个类继承了 MembershipUser 的所有功能,并添加了一些与活动目录相关的属性

      成员身价只用来保管与认证用户,它不兑现其他授权功能,也不提供管理用户角色的效力。因此,你不能不用角色
API
(后续文章会介绍)。

 

 

利用成员身价 API

       采用成员身份 API 和 安全控件之前,必须做到以下步骤:

  1. 当 web.config
    文件中安排表单验证、禁止匿名用户访问
  2. 成立成员身份数据存储。你得在一个您拣的数据库中创造有表和存储过程
  3. 配备数据库连接字符串和你想使当应用程序的
    web.config 文件被运用的分子身价提供次
  4. 创造登录页面,使用 Membership
    类验证用户输入的凭证

       使用 ASP.NET WAT
可以成功除了提供次配置外的其它配置步骤。ASP.NET WAT
包含了一个平安指引,在 VS 中选取“网站”-“ASP.NET 配置”即可:

      
Oracle 1

       一经以相同宝运行 SQL Server Express
的机及采取
WAT,当创建第一只用户时时,底层的数量存储会自行创建。当然,如果您通过编程访问成员身份数据存储,它呢会见自动创建,这个职能是
SqlMembershipProvider 提供的。如果是外版本的 SQL
Server,那么就算需要手动配置数据源。

       当使用 SQL Server Express
版本时,SqlMembershipProvider 会在 App_Data 目录中创造一个称吧 ASPNETDB.MDF
的新数据库。这个数据库实现完整的架,它是保存用户信息、角色信息、用户角色赋权、个性化和用户配置属性所必备的。

      
如果你想用好的数据库而未是全自动创建的数据库来存储用户信息和角色信息,你不能不在运转安全指引之前安排成员身价提供程序与这个提供次的连信息。

 

1. 部署表单验证

       分子身价 API
建立以表单验证的底子及,它提供了一个备的架管理暨证明用户。因此,必须安排程序来利用表单验证

       通常,根本目录对匿名用户来说是足以拜的,它一般含登录页面及注册页面之类的意义。因此,在绝望之
web.config 中只需要蕴涵启用表单验证即可:

<system.web>

    

  <authentication mode="Forms" />

    

</system.web>

       当子目录中,你可另行续加一个
web.config
配置文件来禁止匿名用户访问网站的吃保障之资源
,如果有人没经过验证就视图访问是目录下的资源,ASP.NET
运行时见面自动将用户重定向到登录页面。

<authorization>

    

  <deny users="?"/>

    

</authorization>

 

2. 开立数量存储

       之前提过,当与 ASP.NET 一起行使 SQL Server Express
版本时,SqlMembershipProvider 会自动创建是蕴藏。但假如是任何版本的 SQL
Server,你要手工创建是蕴藏。

       莫下基于文件自动叠加的数据库的主意还有局部外原因:性能及并发性。

       SQL Server Express 可以为单薄种艺术利用数据库:

  • 传统模式:创建或者附加一个数据库及 SQL Server 服务,然后 SQL Server
    会对数据库有全的决定并能够把该数据库并发地提供于多单应用程序和用户
  • 文本模式你的程序能够一直看 SQL
    Server 数据库文件,不待将欠文件附加到 SQL Server
    实例
    。在用经常,SQL Server Express
    实例会动态的叠加或分开之文件,文件才给锁定一段落于短的年月,这不光让对数据库文件的复制变得死去活来易,同时,在拜访时需要分外的载荷。另外,在为有应用程序附加数据库里,其他应用程序都不可知顾该数据库,因为她于当下动之应用程序锁定了。这种模式可 Windows
    客户端应用程序和出,但未符合生育环境

 

       对于生产环境,建议手工创建成员身份数据库。对于
SqlMembershipProvider ,创建这样一个数码存储意味着创建一个 SQL Server
数据库并于斯库里创建同组表和仓储过程。ASP.NET 发布了一如既往层层 SQL
脚论好为此来手工创建数据库暨说明。ASP.NET
还公布了一个工具,它可以在你挑选的数据库里创建这些多少库表和仓储过程。

       夫家伙被作 aspnet_regsql.exe。经过一个先导页面或者命令行使用专门的授命执行开关还足以充分便利之运行它们。无论哪种情况,都必由“Visual Studio
命令行提示”窗口中启动它,因为它们包含了含有必需工具的 .NET Framework
目录的路子信息。如果无加以另参数启动这个家伙,该工具会启动一个奔导界面,它带您通过一样层层步骤创建数据库:

      
Oracle 2

      
Oracle 3

      
Oracle 4

      
Oracle 5

 

       也可以透过命令行使用 aspnet_regsql.exe。实际上,这是自动化程序安装的好点子。比如,要创造成员身价
API 数据库表,可以尽下的通令:

aspnet_regsql.exe –S
(local)\SQLEXPRESS –E –A all –d MyDatabase

      
Oracle 6

aspnet_regsql.exe 的授命执行开关

-S 服务器名 指定 SQL Server 和你想要为其安装 ASP.NET 数据库表的实例
-U 用户名 如果不用 Windows 验证连接 SQL Server,那这是必需的
-P 密码 如果指定了 –U 开关,也需要指定密码开关
-E 显式的指定使用 Windows 验证连接到 SQL Server
-C 允许指定一个用来连接数据库的完整的 ODBC 或者 OLEDB 连接字符串
-sqlexportonly 未添加和删除指定的选项生成 SQL 脚本,而无须在专门的 SQL Server 实例上安装它们
-A 安装应用程序服务。这个参数有效选项为 all、m[成员资格]、r[角色服务]、p[支持用户配置的 ASP.NET 用户配置]、c[Web 部分页面的个性化]、w[SQL Web 事件提供程序]。
-R 卸载应用程序服务。有效选项和 –A 相同
-d 让你随意指定要按照应用程序服务的数据库的名称。默认为 aspnetdb

       aspnet_regsql.exe
工具还噙了另外几个开关,用于安装基于 SQL Server 的对话状态与部署 SQL
缓存依赖(参考前系列文章)

 

1. ASP.NET 服务的数据库脚本

       aspnet_regsql.exe
执行几单脚本来创建或者去成员身份相关的多少库表。这些本子由 .NET
Framework 供:

      
Oracle 7

       基本上在 2 种类型的剧本:InstallXXX 和 UninstallXXX,你们知道的。

 

成员身价 API 的安脚本

InstallCommon.sql 安装成员资格 API 和角色 API 所必需的一些公用的表和存储过程
InstallMembership.sql 安装成员资格 API 使用的表、存储过程和触发器。包含用户表、额外用户属性表和用来访问这些信息的存储过程表
InstallRoles.sql 安装关联用户和程序角色所需要的所有数据库表和存储过程,用于授权
InstallPersonalization.sql 包含用来创建表和存储过程的 DDL。这些表和存储过程是创建带有 Web 部件的个性化网上门户应用程序所必需的
InstallProfile.sql 创建用来支持 ASP.NET 用户配置的所有必需的表和存储过程
InstallSqlState.sql 在 SQL Server 的 TEMP 数据库中安装持久会话状态所需的表。这意味着每次 SQL Server 服务关闭时,会话状态就会丢失
InstallPersistSqlState.sql 在一个单独的 ASPState 数据库中安装持久会话状态所需的表。这意味着即使 SQL Server 服务重新启动,状态仍然存在

       如果您切莫思量要么不克以 aspnet_regsql.exe,也可行使 sqlcmd.exe 命令行工具来执行这些本子:

sqlcmd –S (local)\SQLEXPRESS –E –i InstallCommon.sql

 

2. 冲文件的 SQL Server 存储

       之前曾经说罢,这种模式允许而通过 MDF 文件直接访问 SQL Server
数据库,而未需以一个 SQL Server
实例中创造或者附加它们。只需要将数据库文件复制到目标服务器上即可。不过,据悉文件之模式只用于 Express
版本,大本不支持这种模式,因为它们便对高度可扩大的生产条件不实用

 

 

3. 配备连接字符串和成员身价提供次

       如果应用自己之 SQL Server
数据库,甚至于定义的积极分子身价提供次和多少存储,则须正确的布提供程序及适度的连日至成员身价存储数据库的连年字符串。

       比如,你想行使一个号称吧 MyDatabase 的地方数据库配置连接字符串:

<connectionStrings>

    

  <add name="MyMembershipConnString"

    

       connectionString="data source=(local)\SQLEXPRESS;

    

                         Integrated Security=SSPI;

    

                         Initial Catalog=MyDatabase"/>

    

</connectionStrings>

       还非得也下配置成员身价提供程序,必需把 <membership>
节添加到 web.config 文件的 <system.web> 中:

<membership defaultProvider="MyMembershipProvider">

    

  <providers>

    

    <add name="MyMembershipProvider" 

    

         connectionStringName="MyMembershipConnString"

    

         applicationName="MyMembership"

    

         enablePasswordRetrieval="false"

    

         enablePasswordRest="true"

    

         requiresQuestionAndAnswer="true"

    

         requiresUniqueEmail="true"

    

         passwordFormat="Hashed"

    

         type="System.Web.Security.SqlMembershipProvider"/>

    

  </providers>

    

</membership>

       于 <membership>
节中得长多只当 <providers> 节的子元素。defaultProvider
特性非常重大,这个特性指定你的应用程序将用的积极分子身价提供程序。

 

SqlMembershipProvider 的属性

name 可任意指定提供程序名称。编程访问已配置的成员资格提供程序列表时,这个名字可作引用。此外,WAT 使用它显示提供程序
applicationName 指定成员资格提供程序为之管理好用户和用户设置的程序名。可以为多个应用程序使用一个成员资格数据库。用户和角色总是和应用程序相关联。
description 描述。可选
passwordFormat 获取或设置密码在底层凭证存储中的存储格式。Clear(纯文本)、Encrypted(用本地配置的机器码加密密码)、Hashed(散列化密码)
minRequiredNonalphanumericCharacters 指定密码必需含有的非字母数字字符的个数。重要,这是指定用户所使用密码的强度要求
minRequiredPasswordLength 密码最短长度。这也是一个指定密码强度的指标
passwordStrengthRegularExpression 可以使用正则表达式指定一个有效的密码格式,这就可以非常灵活的指定密码的标准格式了
enablePasswordReset 可以重置密码。如果程序中配置了一个 SMTP 服务器,它还会发送一封 Email
enablePasswordRetrieval 如果为 true,通过 MembershipUser.GetPassword() 可以取回密码。当然,这只有在密码没有被散列化的情况下才起作用
maxInvalidPasswordAttempts 指定用户被锁定之前无效验证重试的次数。默认值 5 。
passwordAttemptWindow 设置以分钟计的时间。在这段时间内可以尝试多次无效密码或者密码回答,时间一过,用户立即被锁定。默认值 10 分钟。管理员必须再次激活这个账号
requiredQuestionAndAnswer 指定程序是否启用密码问题功能。用户忘记密码后并正确回答了问题,他可以通过 Email 重新获得一个自动生成的密码
requiredUniqueEmail 在底层的成员资格存储中指定用户的 Email 地址是否必须唯一

       applicationName
属性要特别注意。实际上,成员身份数据库里的具有目标还和一个应用程序相关联。如果没有当成员身价配置里指定
applicationName,API 或 WAT
会把这些目标通过名称“/”关联到根本应用程序。

 

4. 开立并说明用户

       启动 WAT 切换至平安标签,选择创建用户:

      
Oracle 8

       创建几只用户后,查看数据库的 aspnet_Users 表和
aspnet_Membership 表:

      
Oracle 9

      
Oracle 10

       密码和密码问题的答案都以散列字符串的花样存放于数据库被,因为若当
<membership> 配置节中对供次选择了 passwordFormat=”Hashed” 。

 

       现在可以动用成员身价 API
来说明这些用户了。随便创建一个签到页面,使用下代码来证明用户凭证:

protected void btnLogin_Click(object sender, EventArgs e)

    

{

    

    // Membership: 验证用户凭据并管理用户设置

    

    // ValidateUser(): 验证提供的用户名和密码是有效的

    

    if (Membership.ValidateUser(txtName.Text, txtPwd.Text))

    

    {

    

        FormsAuthentication.RedirectFromLoginPage(txtName.Text, false);

    

    }

    

    else

    

    {

    

        LegendStatus.Text = "Invalid user name or password.";

    

    }

    

}

 

      
你并不需要知道应用程序具体以的凡谁应用程序(Membership
是它的基类)。如果要是转移提供次只需要修改配置文件。

 

 

分类: ASP.NET

相关文章