asp.net2.0用户和角色管理

对他关注已经很久了,以前用的是自己的方法来控制的,就是自己建用户、角色、权限和他们几者之间的关系,达到在程序中控制访问的目的。后来发现.net2.0自己都有这样的东西,当时没时间学习,今天学习了一下,还是对他们有一定的理解,2.0没有权限,只有用户和角色,所以权限还是得自己来写。
一、数据库配置:打开C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727下的aspnet_regsql.exe数据库配置工具,配置好数据库。
二、配置Web.config:这里主要是配置 <system.web>下的membership 和roleManager两个节点。
    1、membership,他的配置要相对复杂些。格式如下:
     <membership>
      <providers >
        <remove name="AspNetSqlMembershipProvider"/>
        <add name="AspNetSqlMembershipProvider" connectionStringName="MemberShip_Connection" 
             type="System.Web.Security.SqlMembershipProvider"
             enablePasswordReset="false"
             requiresUniqueEmail="true"
             requiresQuestionAndAnswer="true" 
             passwordFormat= "Hashed"
             maxInvalidPasswordAttempts= "10"
             passwordAttemptWindow="2"      
             minRequiredPasswordLength= "2"
             minRequiredNonalphanumericCharacters= "0"  
             passwordStrengthRegularExpression= "" 
             />

      </providers>
    </membership>
别的先不看,可以看到有一个remove 节点,这是因为在系统中有一个存在的AspNetSqlMembershipProvider配置,所以在一开始就要移除它,当然也可以换成<clear/>
这两种方式的话,add中的name就一定要写成AspNetSqlMembershipProvider,
还有一种方式,在membership中添加属性defaultProvider="MyProvider",这样的话,下面的节点name就要写成MyProvider了,如:

<membership defaultProvider="MyProvider">
      <providers >
        <add name="MyProvider" connectionStringName="MemberShip_Connection" 
             type="System.Web.Security.SqlMembershipProvider"
             enablePasswordReset="false"
             requiresUniqueEmail="true"
             requiresQuestionAndAnswer="true" 
             passwordFormat= "Hashed"
             maxInvalidPasswordAttempts= "10"
             passwordAttemptWindow="2"      
             minRequiredPasswordLength= "2"
             minRequiredNonalphanumericCharacters= "0"  
             passwordStrengthRegularExpression= ""
            
             />

      </providers>
    </membership>

connectionStringName属性是表示连接到数据库的字符串,但注意,关不是在这里写边接字符串,这里只是它的名字而已,要在connectionStrings中添加一个节点,如:
 <add name="MemberShip_Connection" connectionString="Server=(local);DataBase=MS;uid=sa;pwd=;" providerName="System.Data.SqlClient"/>
 type表示用种方式的数据库,我这里是用的SQL,就是:"System.Web.Security.SqlMembershipProvider"

现在再来看节点中的其它属性,

enablePasswordRetrieval   获得一个值,指示当前成员资格提供程序是否配置为允许用户检索其密码。
enablePasswordReset   获得一个值,指示当前成员资格提供程序是否配置为允许用户重置其密码。
requiresQuestionAndAnswer   获取一个值,该值指示默认成员资格提供程序是否要求用户在进行密码重置和检索时回答密码提示问题。
applicationName   获取或设置应用程序的名称。
requiresUniqueEmail   指示用户在创建用户时是否必须提供唯一的电子邮件地址值。
passwordFormat   指示在成员资格数据存储区中存储密码的格式。下面有详细说明
maxInvalidPasswordAttempts   获取锁定成员资格用户前允许的无效密码或无效密码提示问题答案尝试次数。
minRequiredPasswordLength   获取密码所要求的最小长度。
minRequiredNonalphanumericCharacters   获取有效密码中必须包含的最少特殊字符数。
passwordAttemptWindow   获取在锁定成员资格用户之前允许的最大无效密码或无效密码提示问题答案尝试次数的分钟数。

对PasswordFormat   的详细说明
属性指示存储密码的格式。密码可以采用   Clear、Encrypted   和   Hashed   密码格式存储。
Clear   密码以明文形式存储,这可以提高存储和检索密码的性能,但安全性较差,当数据源安全性受到威胁时此类密码很容易被读取。
Encrypted   密码在存储时进行了加密,可以在比较或检索密码时进行解密。此类密码在存储和检索时需要进行额外的处理,但比较安全,
   在数据源的安全性受到威胁时不容易被获取。
Hashed   密码在存储到数据库时使用单向哈希算法和随机生成的   salt   值进行哈希处理。在验证某一密码时,
将用数据库中的   salt   值对该密码进行哈希计算以进行验证。无法检索哈希密码。

不过当PasswordFormat   设为了Encrypted 和 Hashed时,我不知道如何与数据库中进行对比,用md5加密后对比是不行的。
2、roleManager,他相对就简单多了,东西也很少,不过默认下是禁用的,所以要启用他。如:
 <roleManager enabled="true" cacheRolesInCookie="true"  >
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider"  connectionStringName="MemberShip_Connection"  type="System.Web.Security.SqlRoleProvider"/>
      </providers>
    </roleManager>

他的属性和membership差不多,就不多说了, cacheRolesInCookie="true" 是启动高速缓存,在下次登录时,会先查看本机的cookie。
三、MemberShip 和 MemberShipUser
    很明显可以看出,一个是管理器,一个是实体,MemberShip有很多的静态方法,可对MemberShipUser进行CRUD操作,MemberShipUser也有很多方法,
    这样就可以非常快地管理用户了,如果把控制加上来一起用的话,会发现,根本不用写一行代码~太爽了。我有一个验证用户登录的代码:
if (Membership.ValidateUser(TextBox1.Text, TextBox2.Text))
        {
            FormsAuthentication.RedirectFromLoginPage(TextBox1.Text, false);
            MembershipUser user = Membership.GetUser(TextBox1.Text);
            user.Comment = "0";
            Membership.UpdateUser(user);
        }
        else
        {
            MembershipUser user = Membership.GetUser(TextBox1.Text);
            if (user != null)
            {
                user.Comment = Convert.ToString(Convert.ToInt32(user.Comment) + 1);
                Membership.UpdateUser(user);
            }
        }

其它的就很简单了,要配合自己的逻辑才能更快地写出来。
四、Roles,
    他只有一个类,也就相当于是管理器,而实体则是一个字符串,
    可以添加角色,删除角色,把用户添加或移出角色,查找等
    感觉他就没有什么说的了一样,也没有什么特殊性的东西。

通过用户和角色的管理,可以很快地管理用户和角色,如果再加上权限、权限和角色关系的话,就会很有用了,
附上一个我写的练习,不过是乱七八糟的。

练习代码
 

posted @ 2008-03-06 17:16  point.deng  阅读(800)  评论(0编辑  收藏  举报