•成员服务
–成员接口
–成员提供
•登录控件
•角色管理服务
–角色类
–角色缓存
–角色提供
成员服务
•用户和凭证管理服务
–通过Web Site Admin Tool工具来访问
–在程序中通过Membership和MembershipUSer类访问
•Membership类提供了基类服务
•MembershipUser类描述用户定义并提供辅助的服务
•为不同的数据存储提供程序
成员关系模式
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
•为不同的数据存储提供程序
角色管理模式
角色类
•通往角色管理 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>