小李广

学习是一个勤学苦练的过程
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

•成员服务

–成员接口

–成员提供

•登录控件

•角色管理服务

–角色类

–角色缓存

–角色提供  

 

成员服务

•用户和凭证管理服务

–通过Web Site Admin Tool工具来访问

–在程序中通过Membership和MembershipUSer类访问

•Membership类提供了基类服务

•MembershipUser类描述用户定义并提供辅助的服务

•为不同的数据存储提供程序

 成员关系模式

image

Membership类

•为成员任务提供静态方法

–创建和删除用户

–检索用户信息

–生成随机密码

–登录验证

•也包含了只读的静态方法从提供程序的设置中获取数据

   创建新用户

try {
    Membership.CreateUser ("Jeff", "imbatman", "jeff@microsoft.com");
}
catch (MembershipCreateUserException e) {
    // Find out why CreateUser failed
    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);
 

MembershipUser类

•描述在成员数据存储中单一的注册用户信息

•包含了众多的属性来获取和设置用户信息

•包含方法来检索、改变和重设密码

•通过诸如GetUser 和CreateUser的属性返回值

   挂起登录权限

if (Membership.ValidateUser(UserName.Text, Password.Text))
{
    MembershipUser user = Membership.GetUser(UserName.Text);
    user.Comment = "0"; // Reset the count of failed login attempts
    RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
}
else
{
    MembershipUser user = Membership.GetUser(UserName.Text);
    if (user != null)
    {
        // Get a count of consecutive failed login attempts
        string count = Convert.ToInt32(user.Comment) + 1;

        // If the count equals or exceeds 5, suspend login privileges
        if (count >= 5)
            user.IsApproved = false;

        // Update the count of consecutive failed login attempts
        user.Comment = count.ToString();
    }
}

 

成员提供程序

•成员关系是基于提供程序

–提供程序在成员服务和物理数据存储之间提供接口

•Beta 1 有两种提供程序

–AccessMembershipProvider (Access)*

–SqlMembershipProvider (SQL Server)

•为其他数据存储使用自定义提供程序

   使用 SQL Server提供程序

<configuration>
  <system.web>
    <membership defaultProvider="AspNetSqlProvider" />
  </system.web>
</configuration>
 

   配置提供程序

•成员提供程序支持许多配置选项

–密码如何被存储 (明文, 散列, 加密)?

–密码是否允许被恢复?

–用户是否必须有一个唯一的e-mail地址?

•通过提供程序类属性来表现

•在配置文件中进行初始化

   更改提供程序配置

<membership>
  <providers>
    <remove name="AspNetSqlProvider" />
    <add name="AspNetSqlProvider"
      type="System.Web.Security.SqlMembershipProvider, System.Web, ..."
      connectionStringName="RemoteSqlServer"
      enablePasswordRetrieval="false"
      enablePasswordReset="true"
      requiresQuestionAndAnswer="false"
      applicationName="/"
      requiresUniqueEmail="false"
      passwordFormat="Hashed"
      description="Stores and retrieves membership data ..."
  />
  </providers>
</membership>
 

登录控件

•标准的用户登录接口

•与成员服务集成

–自动调用用户验证

–验证和登录无需编写代码

•可以脱离成员服务工作

•合并RequiredFieldValidators

•高度可定制的用户接口和行为

   使用登录控件

 <html>
  <body>
    <form id="Form1" runat="server">
      <asp:Login ID="Login1" RunAt="server" />
    </form>
  </body>
</html>
 

   定制登录控件

<asp:Login ID="LoginControl" RunAt="server"
  CreateUserText="Create new account"
  CreateUserUrl="CreateUser.aspx"
  DisplayRememberMe="false"
  PasswordRecoveryText="Forgotten your password?"
  PasswordRecoveryUrl="RecoverPassword.aspx"
  SubmitButtonText="Do It!"
  TitleText="Please Log In"
/>
 

   确认凭证格式

<asp:Login ID="LoginControl" RunAt="server"
  OnLoggingIn="OnValidateCredentials" ... />
    .
    .
    .
<script language="C#" runat="server">    
    void OnValidateCredentials (Object sender, CancelEventArgs e)
    {
        if (!Regex.IsMatch (LoginControl.UserName, "[a-zA-Z0-9]{6,}") ||
            !Regex.IsMatch (LoginControl.Password, "[a-zA-Z0-9]{8,}")) {
            LoginControl.InstructionText = "User names and passwords " +
                "must contain letters and numbers only and must be at " +
                "least 6 and 8 characters long, respectively";
            e.Cancel = true;
        }
    }
</script>
 

角色管理服务

•基于角色的安全

–通过 Web Site Admin Tool工具来访问

–在程序中通过Roles类访问

•角色类中包含了静态的方法来创建角色,增加用户到角色等

•在每一个请求中映射用户到角色中

–替换Application_AuthenticateRequest

•为不同的数据存储提供程序

   角色管理模式

image

  

   角色类

•通往角色管理 API的入口

•提供静态方法为角色分派任务

–创建和删除角色

–增加用户到角色

–从角色中移走用户

•也包括静态属性来从提供程序设置中获取数据

      创建新角色

if (!Roles.RoleExists("Developers"))
{
    Roles.CreateRole("Developers");
}

      增加用户到一个角色

string name = Membership.GetUser().Username;
Roles.AddUserToRole(name, "Developers");
 

   启用角色管理

•角色管理缺省是禁用的

•配置Web.config启用角色:

<configuration>
  <system.web>
    <roleManager enabled="true" />
  </system.web>
</configuration>
 

   角色高速缓存

•角色管理在cookies中缓存角色

–减少对数据源的访问

–提高性能

•通过配置<roleManager>节属性或在程序中通过Roles类进行控制

–角色是否被缓存在 cookies中?

–cookies中的角色是否被加密?

–在cookies中的角色有效期为多长?   

      启用角色高速缓存

<configuration>
  <system.web>
    <roleManager enabled="true" cacheRolesInCookie="true" />
    <!-- Other roleManager attributes (and their defaults) include:
    cookieName=".ASPXROLES"         // Cookie name
    cookieTimeout="30"              // Cookie lifetime
    cookiePath="/"                  // Cookie path
    cookieRequireSSL="false"        // Restrict cookie to SSL?
    cookieSlidingExpiration="true"  // Renew expiring cookies?
    createPersistentCookie="false"  // Issue persistent cookie?
    cookieProtection="All" />       // Cookie protection level
  -->
  </system.web>
</configuration>
 

角色管理 提供程序

•基于角色管理的提供程序

•在Beta 1中的四种提供程序

–AccessRoleProvider (Access)*

–AuthorizationStoreRoleProvider (AuthMan)

–SqlRoleProvider (SQL Server)

–WindowsTokenRoleProvider (Windows)

•为其他数据存储使用定制的提供程序

   使用SQL Server提供程序

<configuration>
  <system.web>
    <roleManager enabled="true" defaultProvider="AspNetSqlRoleProvider" />
  </system.web>
</configuration>