asp.net 2.0教程 成员资格和角色管理

原创 2007年10月08日 15:54:00

每一个完善的网站管理系统都应该包括用户管理、角色管理,都包含用户注册、密码修改、用户登录、身份验证等功能。在asp.net 1.x时代,程序员为了这些常用的功能反复做着重复性的工作,今天的asp.net 2.0替我们封装了这些常用控件及机制,给我们带来了诸多便利。接下来两节我们就来学习这方面的内容。
这一节我们讲述asp.net 2.0的成员资格和角色管理部分。


1、asp.net的身份验证方式
asp.net的身份验证方式有4种:Windows验证、Passport验证、None验证、Forms验证。在我们的Web应用程序开发中,Forms验证方式是最常用的,所以这里我们只涉及Forms验证。
asp.net 2.0网站的身份验证信息除了可以像常规程序那样保存在Cookie中之外,还提供了一种Url保存会话的方案,即“无Cookie会话功能”。“无Cookie会话功能”是为了避免客户端因为屏蔽了Cookie功能而无法进行身份验证的情况而设计的,但是这个功能同时也带来了安全隐患,所以仍然建议使用Cookie会话方案。
基于Forms的身份验证时,需要设置Web.config网站配置文件,设置<system.web>元素下的<authentication> 元素的 <forms> 子元素:

    <authentication mode="Forms">
      <forms name=".VS2005_Form" loginUrl="~/Security/Login.aspx" defaultUrl="~/Default.aspx"
           protection="All" timeout="30" path="/" requireSSL="false"
           slidingExpiration="true" enableCrossAppRedirects="false"
           cookieless="UseDeviceProfile">
      </forms>
    </authentication>

<forms>元素的属性说明如下
1) cookieless - 身份验证可以将 Forms 身份验证票存储在 Cookie 中也可以以无 Cookie 的表示形式存储在 URL 上。有效值如下:
   ·UseDeviceProfile - 默认值表示 ASP.NET 根据预先计算得到的浏览器配置文件来确定存储票证的位置。
   ·AutoDetect - 选项使 ASP.NET 动态确定浏览器是否支持 Cookie。
   ·UseUri - 强制实施无 Cookie 票证
   ·UseCookies - 强制实施有 Cookie 票证。
2) defaultUrl - 指定在成功登录后,请求将重定向到的默认 URL。
3) domain - 指定包含 Forms 身份验证票的 HttpCookie 的 Domain 属性的值。显式设置此属性可使应用程序共享同一个 Cookie,前提是这些应用程序共享某个 DNS 命名空间的一个公共部分(例如,如果 domain 属性设置为“cnblogs.com”,则 webabcd.cnblogs.com 和 dudu.cnblogs.com可以共享一个 Cookie)。
4) enableCrossAppRedirects - Forms 身份验证允许以查询字符串变量或窗体 POST 变量的形式在应用程序之间传递 Forms身份验证票。将此属性设置为 true 可使 FormsAuthenticationModule 能够从查询字符串或窗体 POST 变量提取票证。
5) loginUrl - 指定未经身份验证的用户的请求将被重定向到的 URL。该 URL 可以在同一台计算机上或在远程计算机上。如果是在远程计算机上,则两台计算机上 machineKey 配置元素中的 decryptionkey 和 validationKey 属性都需要使用相同的值。
6) name - 用于身份验证的 HTTP Cookie 的名称。注意,如果多个应用程序需要在一台计算机上使用基于窗体的身份验证服务,并且每个应用程序都希望由应用程序隔离 Forms 身份验证 Cookie,则每个应用程序都应配置一个唯一的 Cookie 值。为避免在 URL 中产生依赖项,在设置身份验证 Cookie 时,ASP.NET 还使用“/”作为 Path 值,以便将这些 Cookie 发送回站点上的每个应用程序。
7) path - 用于发出的 Cookie 的路径。默认值为“/”,以避免路径中大小写不匹配的造成的困难,因为在返回 Cookie 时,浏览器是严格区分大小写的。共享服务器环境中的应用程序应使用此指令来维护专用 Cookie。(它们还可以使用 API 在运行时指定路径来发出 Cookie。)
8) protection - 用于保护 Cookie 数据的方法。有效值如下:
   ·All - 同时使用数据验证和加密来保护 Cookie。所配置的数据验证算法是基于 <machinekey> 元素的。如果密钥足够长(48 个字符),默认情况下将使用 AES 进行加密。All 是默认(和建议)值。
   ·None - 用于仅将 Cookie 用于个性化设置并且安全性要求不高的站点。加密和验证都可以被禁用。尽管以此方式使用 Cookie 需谨慎,但对于使用 .NET Framework 实现个性化设置的任何方法,此设置提供了最佳性能。
   ·Encryption - 使用 AES、TripleDES 或 DES 加密 Cookie,但不对 Cookie 进行数据验证。这类 Cookie 容易受到精心选择的纯文本的攻击。
   ·Validation - 不加密 Cookie 的内容,但验证 Cookie 数据在传输过程中是否未被更改。若要创建 Cookie,验证密钥在缓冲区中与 Cookie 数据连接,并且计算出 MAC 并将其追加到输出的 Cookie。
9) requireSSL - 如果设置为 true,则 Forms 身份验证会设置 Forms 身份验证 Cookie 的安全位。兼容的浏览器只将 Cookie 通过 SSL 连接发送回 ASP.NET。注意,如果使用无 Cookie Forms 身份验证,则此设置无效。
10) slidingExpiration - 如果设置为 true,则 Forms 身份验证将定期更新 Forms 身份验证票的生存期。无论票证是包含在 Cookie 中,还是以无 Cookie 的格式包含在 URL 中,都会进行此操作。
11) timeout - 时间量(以整数分钟为单位),经过该时间量之后,Cookie 则会过期。默认值是 30。超时属性是一个可调值,从收到上次请求的时间开始计算,它将在 n 分钟后过期。为了避免对性能产生负面影响,也为了避免那些打开了 Cookie 警告的应用程序产生多个浏览器警告,Cookie 在超时时间过半时更新。(这意味着在某些情况下可能会出现精度损失。) #p#分页标题#e#

2、用户授权。
在asp.net 2.0程序中,我们可以通过对Web.config文件进行配置,从而达到对访问权限的控制,配置方法如下:

<authorization>
    <allow VERB="POST" users="2abcd@gmail.com" />
    <allow roles="admin" />
    <deny users="*" />
    <allow VERB="GET" users="abc,xyz" />
    <deny users="?" />
</authorization>

注:可以把授权用户和角色设置的配置写在某个文件夹内,则所做的配置只作用于该文件夹内,自动继承外面的配置。
allow - 允许
deny - 拒绝
users - 用户(多用户用逗号隔开)
roles - 角色(多角色用逗号隔开)
verb - 指定http方法,post或get
* - 所有用户
? - 匿名(未经过身份验证的)用户

我们还可以按路径对角色授权:

    <location path="folder">
        <system.web>
            <authorization>
                <deny users="?"/>
                <allow users="*"/>
            </authorization>
        </system.web>
    </location>
   
    <location path="abc.aspx">
        <system.web>
            <authorization>
                <allow roles="Administrators" />
                <deny users="*"/>
            </authorization>
        </system.web>
    </location>

<location>元素的path属性可以是文件夹也可以是某一文件

3、成员资格管理
Membership类和MembershipUser类是成员资格管理API中的重要成员。利用它们,我们能够实现用户的验证、管理、信息检索等功能。但在使用它们之前,我们需要修改Web.config来对其进行配置。配置示例:

    <membership defaultProvider="SqlMembershipProvider">
      <providers>
        <clear/>
        <add name="SqlMembershipProvider"
              type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
              connectionStringName="SqlConnectionString"
              enablePasswordRetrieval="false"
              enablePasswordReset="true"
              requiresQuestionAndAnswer="false"
              applicationName="/"
              requiresUniqueEmail="false"
              passwordFormat="Hashed"
              maxInvalidPasswordAttempts="3"
              minRequiredPasswordLength="3"
              minRequiredNonalphanumericCharacters="0"
              passwordAttemptWindow="10"
              passwordAnswerAttemptLockoutDuration="15"
              passwordStrengthRegularExpression="" />
      </providers>
    </membership>

enablePasswordRetrieval - 是否可以检索用户密码(总是false)
enablePasswordReset - 是否允许用户重置其密码
requiresQuestionAndAnswer - 是否要求在创建用户时提供密码提示问题和答案#p#分页标题#e#
applicationName - 自定义成员资格提供程序的应用程序的名称
requiresUniqueEmail - 电子邮件地址是否必须是唯一的
passwordFormat - 存储的密码的格式
maxInvalidPasswordAttempts - 用户回答密码重置问题时允许失败的次数
minRequiredPasswordLength - 密码所要求的最小长度
minRequiredNonalphanumericCharacters - 有效密码中必须包含的最少特殊字符数
passwordAttemptWindow - 连续未能正确回答密码重置问题的次数进行跟踪的时间长度(单位:分钟)
passwordAnswerAttemptLockoutDuration - 用户多次未能正确回答密码提示问题后用户帐户的锁定时间长度(单位:分钟)
passwordStrengthRegularExpression - 用于验证密码的正则表达式

Membership类部分功能实现代码示例:
 创建新用户:

  try{
         Membership.CreateUser ("name", "password", "mail");
       }
  catch (MembershipCreateUserException e)
       {
       // 失败
       switch (e.StatusCode)
          {
       case MembershipCreateStatus.DuplicateUsername:
          ……;
       case MembershipCreateStatus.DuplicateEmail:
          ……;
       case MembershipCreateStatus.InvalidPassword:
          ……;
       default:
          ……;
          }
       }

登录验证:

 if (Membership.ValidateUser (UserName.Text, Password.Text))
     FormsAuthentication.RedirectFromLoginPage (UserName.Text, RememberMe.Checked);

可以使用的方法:CreateUser(创建用户)  DeleteUser(删除用户)  GeneratePassword(生产随即密码)  GetAllUsers(得到用户)  GetUser(查看某个用户) UpdateUser(修改用户)  ValidateUser(验证是否成功)

MembershipUser类部分功能实现代码示例:
 挂起登录权限:

 if (Membership.ValidateUser (UserName.Text, Password.Text)) {
    MembershipUser user = Membership.GetUser (UserName.Text);
    user.Comment = "0"; //记录登录次数
    RedirectFromLoginPage (UserName.Text, RememberMe.Checked);
    }
    else {
    MembershipUser user = Membership.GetUser (UserName.Text);
    if (user != null) {
        string count = Convert.ToInt32 (user.Comment) + 1;
         user.Comment = count.ToString ();
    }
}

它的一些方法和属性:
属性:Comment  CreationDate  Email  LastLoginDate  LastPasswordChangedDate  UserId  UserName
方法:  ChangePassword  ChangePassword-QuestionAndAnswer   GetPassword   ResetPassword

4、角色管理
若要实现角色管理,必须首先对Web.config文件中的<roleManager>配置节进行配置:

    <roleManager defaultProvider="SqlRoleProvider"
       enabled="true"
       cacheRolesInCookie="true"
       cookieName=".VS2005_Role"
       cookieTimeout="30"
       cookiePath="/"
       cookieRequireSSL="false"
       cookieSlidingExpiration="true"
       cookieProtection="All">
      <providers>
        <add
          name="SqlRoleProvider"
           type="System.Web.Security.SqlRoleProvider"
           connectionStringName="SqlConnectionString"
           applicationName="/" />
      </providers>
    </roleManager>

cacheRolesInCookie :指定当验证某个用户是否在特定角色中时,先检查 Cookie,然后使用角色提供程序在数据源中检查角色列表。如果为 true,则缓存当前用户的 Cookie 中的角色名称列表;否则为 false。 默认值为 false。 #p#分页标题#e#
cookieName:指定存储角色名称的 Cookie 的名称。默认值为 ".ASPXROLES"。
cookiePath :角色名称 Cookie 的路径。 默认值为 "/"。
cookieProtection:指定 CookieProtection 枚举值之一。默认值为 All 值。
cookieRequireSSL:指定角色名称 Cookie 是否需要使用 SSL 来发送到服务器。如果设置为 true,则角色名称 Cookie 需要使用 SSL 来发送到服务器。 默认值为 false。
cookieSlidingExpiration:指定是否将定期重置角色名称 Cookie 的过期日期和时间。如果设置为 true,则 Cookie 的过期日期和时间最初将设置为当前日期和时间与 CookieTimeout 值(分钟)的加和。当用户继续主动地使用 ASP.NET 应用程序时,Cookie 的过期日期和时间将在剩余时间不足 CookieTimeout 值的一半时自动更新。有关更多信息,请参见 Expires。默认值为 true。
cookieTimeout:角色名称 Cookie 过期之前的时间(分钟)。默认值为 "30"(分钟)。
createPersistentCookie:指定角色名称 Cookie 是否为会话 Cookie;即,该 Cookie 会在浏览器关闭时丢失。如果设置为 true,则角色名称 Cookie 是可跨多个浏览器会话使用的持久性 Cookie。持久性 Cookie 的过期日期和时间设置为当前的日期和时间与 CookieTimeout 值(分钟)的加和。默认值为 false。
defaultProvider:默认角色提供程序的名称。有关更多信息,请参见 Provider。默认值为 "AspNetSqlRoleProvider"。
domain:指定角色名称 Cookie 的 Domain 值。默认值为 HttpCookie 属性默认值,该值为空字符串 ("")。
enabled:指定是否要启用角色管理。如果设置为 true,则启用角色管理。在 Machine.config 文件中,默认值为 false。
maxCachedResults:指定缓存在角色 Cookie 中的角色名称的最大数目。默认值为 25。
 
角色管理的API包括很多类,例如:Roles、RolePrincipal、RoleManagerEventArgs、RoleManagerModule等,其中Roles类是最重要的也是最常用的。
Roles类常用的方法:AddUserToRole  CreateRole  DeleteRole   GetRolesForUser(查看用户角色)   GetUsersInRole   IsUserInRole  RemoveUserFromRole

因为本节相关属性、方法、事件众多,所以这里只能尽可能地把常用的东东摆出来,如果有不明白的地方请自行搜索,google一下。

成员资格源代码:
upload/2007_05/07051722446157.rar
角色管理源代码:
upload/2007_05/07051722442920.rar
注:以上代码取自《ASP.NET 2.0开发指南》一书,感谢原作者

 

ASP.Net--成员资格、授权和安全性(一)

安全性,无趣却极其重要。。。。。 asp.net mvc不像asp.net web form那样提供了很多自动保护机制来保护页面不受恶意用户的攻击,例如: ①服务器组件对显示的值和特性进行html...
  • liwei825755184
  • liwei825755184
  • 2016年08月29日 10:40
  • 410

MVC4 成员资格、 身份验证

SimpleMembership,成员资格提供程序、 通用的提供者和新的 ASP.NET 4.5 Web 窗体和 ASP.NET MVC 4 模板 ASP.NET MVC 4 互联网模板中添加一些新...
  • sat472291519
  • sat472291519
  • 2013年09月26日 10:10
  • 10308

转:ASP.NET MVC:窗体身份验证及角色权限管理示例

前言   本来使用Forms Authentication进行用户验证的方式是最常见的,但系统地阐明其方法的文章并不多见,网上更多的文章都是介绍其中某一部分的使用方法或实现原理,而更多的朋友则发...
  • lenovouser
  • lenovouser
  • 2016年08月09日 22:47
  • 1182

基于角色的权限控制

基于角色的权限控制 RBAC模型的基本思想是将访问许可权分配给一定的角色,用户通过饰演不同的角色获得角色所拥有的访问许可权。 用户(User):一个具有唯一标识符的用户,与权限相分...
  • fatshaw
  • fatshaw
  • 2017年03月31日 16:13
  • 392

ASP.NET Membership和角色管理器

实习期的总结。
  • hellobabygogo3
  • hellobabygogo3
  • 2014年07月17日 14:39
  • 3056

ASP.NET网站性能优化之成员资格,角色,配置文件的优化

本文讨论在使用 ASP.NET 成员资格、角色、配置文件属性、会话状态、Web 部件个性化设置和站点导航时的性能优化。 成员资格 有效地收集成员资格列表 在调用 Membership...
  • Bens2014
  • Bens2014
  • 2014年05月22日 20:22
  • 350

asp.net identity(微软首推的身份验证)2.0分析-基于vs2015默认程序

因为总是感觉,asp.net identity用起来不太舒服,比如代码的扩展性,以及维护以后的版本,所以对其进行分析 下面进入正文: 在vs2015自带的默认程序中,App_Start/Ident...
  • loongsking
  • loongsking
  • 2017年02月05日 17:50
  • 906

项目角色职责分配表 项目角色划分

项目角色职责分配表   角色 项目初始阶段 详细设计阶段 编码阶段 测试阶段 项目经理 Project Manager 参与或辅助项目谈判,提供项目交付时间和技术方...
  • deepwishly
  • deepwishly
  • 2013年07月07日 15:14
  • 16067

asp.net core mvc权限控制:权限控制介绍

在进行业务软件开发的时候,都会涉及到权限控制的问题,asp.net core mvc提供了相关特性。 在具体介绍使用方法前,我们需要先了解几个概念: 1,claim:英文翻译过来是声明的意思,一个cl...
  • dxp909
  • dxp909
  • 2017年02月11日 09:17
  • 1187

ASP.net MVC 基于角色的权限控制系统的实现

一、引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法。 下面是最常见的实现方式: public ...
  • jiangfei009003
  • jiangfei009003
  • 2014年08月06日 09:42
  • 2651
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:asp.net 2.0教程 成员资格和角色管理
举报原因:
原因补充:

(最多只允许输入30个字)