ASP.NET 2.0通过利用角色管理和成员关系构建安全的应用程序

•成员服务

–成员接口

–成员提供

•登录控件

•角色管理服务

–角色类

–角色缓存

–角色提供  

 

成员服务

•用户和凭证管理服务

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

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

•Membership类提供了基类服务

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

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

 成员关系模式

image

Membership类

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

–创建和删除用户

–检索用户信息

–生成随机密码

–登录验证

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

   创建新用户

try {

    Membership.CreateUser ("Jeff", "imbatman", "[email protected]");

}

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>

你可能感兴趣的:(asp.net)