SQL Server[转]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 配置”即可:

      
SQL Server 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
目录的路径信息。如果未加任何参数启动这个家伙,该工具会启动一个朝向导界面,它带您通过一致多样步骤创建数据库:

      
SQL Server 2

      
SQL Server 3

      
SQL Server 4

      
SQL Server 5

 

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

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

      
SQL Server 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 提供:

      
SQL Server 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 切换至平安标签,选择创建用户:

      
SQL Server 8

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

      
SQL Server 9

      
SQL Server 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

相关文章