成员和角色管理器提供程序——现在ASPNET 包含了内建的成员和角色管理服务由于这些服务都是提供程序驱动的(providerdriven)你可以轻易地变更它或者用自定义实现来代替它
登录控件——新的登录控件为站点的基于认证和授权的UI(例如登录窗体创建用户窗体密码取回已登录用户或角色的定制UI)提供了基本模块这些控件利用ASPNET 中的内建的成员和角色服务与站点所定义的用户和角色信息交互操作
大多数Web应用程序的一个重要的部分是辨别用户并控制资源的访问权检测请求的实体(entity)身份的操作就是认证(authentication)通常为了进行认证用户必须提供凭证例如帐号/密码一旦认证过的身份是有效的就必须检测该身份是否能够访问指定的资源这个过程就是授权(authorization)ASPNET与IIS一起为应用程序提供认证和授权服务
COM对象的一个重要特性就是它能够控制那些运行COM对象代码的身份当COM对象用请求的实体身份运行代码的时候就称为模仿(impersonation)ASPNET框架组件应用程序可以选择模仿请求
有些应用程序还希望根据请求的身份或者根据请求的身份所属的角色来动态地定制内容ASPNET框架组件应用程序可以动态地检测当前请求的身份是否属于某种角色例如应用程序可能希望检测当前用户是否属于管理员角色以便为管理员有条件地生成内容
ASPNET 的成员特性使你创建和管理用户更加容易了成员特性一般与另外一个叫做角色管理器的新特性一起运作角色管理器为创建角色和给角色指定用户提供了下层结构当成员角色管理器特性和窗体认证一起工作的时候ASPNET 就可以为创建认证和授权用户提供端对端的支持
成员和角色管理器都是用基于提供程序的模型设计的提供程序从特性所暴露的类和业务逻辑中提取特性的物理数据存储成员和角色管理器特性都带有Microsoft SQL Server提供程序成员特性还带有一个用于处理活动目录和活动目录应用程序模式(ADAM)的提供程序角色管理器特性带有一个能利用Windows Server 授权管理特性的提供程序你可以建立自定义的提供程序并配置它与成员和角色管理器特性一起使用使用自定义提供程序的时候利用成员和角色管理器特性的页面仍然会继续工作毫无改变
登录控件是一组自定义的服务器控件它为认证和授权事务提供了公用的用户界面登录控件利用了成员角色管理器和窗体认证特性中的功能
认证和授权
ASPNET与IIS一起支持使用基本的Digest和Windows认证ASPNET支持微软Passport认证服务它支持单点登录服务和用户配置服务ASPNET还支持一种使用基于窗体认证的强大的服务基于窗体的认证使用Cookie来认证用户并允许应用程序执行自己的凭证验证过程
我们要认识到ASPNET认证服务是受到IIS提供的认证服务制约的例如为了在IIS应用程序中使用基本认证你就必须使用Internet服务管理工具来配置应用程序以使用基本认证
ASPNET提供了两种授权服务
◆检查ACL(访问控制列表)或资源权限看某个认证过的用户是否能够访问该资源
◆URL授权它批准一个身份使用一定的Web空间
为了演示它们的差别我们来看一个例子假设某个应用程序允许匿名用户使用IUSR_MYMACHINE帐号访问当某个ASPNET页面(例如/defaultaspx)的请求通过认证之后就会依据该文件(例如c\inetpub\wwwroot\defaultaspx)的ACL进行检查看IUSR_MYMACHINE帐号是否有权限读取这个文件如果有权限就对访问进行授权如果Web内容位于NTFS卷中并且已经配置了虚拟目录使用Windows认证文件的授权就会自动地执行
对于URL授权来说会依据ASPNET应用程序的配置数据来进行检查如果允许访问被请求的URL请求就获得授权了在例子中ASPNET检查匿名用户是否有访问/Defaultaspx的权限(也就是说检查过程是依据URL本身的没有依据URL最终解析成的文件)
这种差别看起来很细微但是它让应用程序能够使用类似基于窗体的认证或Passport认证在这些认证模式中用户不需要与计算机或域帐号相对应它还允许你进行虚拟资源的授权(在资源下方并没有物理文件)例如应用程序可以把所有对stk文件的请求映射给一个处理程序它根据查询字符串中的变量来进行证券报价在这种情况下没有物理的stk文件可供ACL检查因此使用URL授权来控制虚拟资源的访问权
文件授权通常依赖IIS提供的通过认证的帐号来执行如果允许匿名访问它就是配置的匿名帐号否则就是NT帐号它的工作方式跟ASP是一样的
在资源管理器属性页面的安全选项卡中可以设置文件或目录的ACL(访问控制列表)URL授权被配置为ASPNET框架组件应用程序的一部分在授权用户和角色部分有完整的讲解
为了激活ASPNET的认证服务你必须在应用程序的配置文件中配置<authentication>元素这个元素可以包含下表列举的任何值
值描述None没有激活的ASP
NET认证服务
请注意IIS认证服务仍然存在
WindowsASP
NET认证服务给当前请求附加上WindowsPrincipal (System
Security
Principal
WindowsPrincipal)
以保证根据NT用户或组进行授权
FormsASP
NET认证服务管理cookie并把未认证的用户重定向到登录页面
它通常在IIS允许匿名访问应用程序的时候使用
PassportASP
NET认证服务提供了Passport SDK (你必须安装)的一个方便的包装
例如下面的配置文件允许应用程序使用基于窗体(cookie)的认证
<configuration>
<systemweb>
<authentication mode=Forms/>
</systemweb>
</configuration>
使用登录控件
下面的例子演示了在应用程序中如何使用登录控件
创建和登录用户
在例子中我们会看到站点的主页它包含了一个LoginStatus控件该控件提示用户登录站点这个页面上的LoginStatus控件检查用户当前是否通过了认证并向用户显示一个登录链接用户点击这个链接就可以看到默认的loginaspx页面在nfig中已经把这个页面配置为窗体认证Login控件显示在Loginaspx页面上(请注意在默认的登录页面上登录控件的VisibleWhenLoggedIn属性会被忽略)在例子中登录控件设置了额外的属性显示了创建用户链接点击这个链接会访问另外一个页面那个页面使用了CreateUserWizard控件在默认情况下CreateUserWizard控件包含两个步骤在第一步中用户输入必要的信息当他们点击创建用户按钮的时候控件把这些信息传递给成员API如果成员API不能建立该用户在控件中会显示适当的错误信息如果用户创建成功控件就载入向导的第二步在例子中ContinueDestinationPageUrl属性被设置为在用户创建成功之后返回主页在默认情况下当用户被成功创建之后CreateUserWizard会认证并登录用户当用户返回到主页的时候他们会注意到LoginStatus被删除了他们已经通过了认证并显示了一个登出链接点击登录链接会引起用户认证票据(ticket)被清除并显示登录链接这时用户可以点击登录链接由于他们已经创建了用户帐号所以可以在loginaspx上输入用户名和密码来登录网站你可能注意到Login控件显示了一个记住帐号(remember me)检查框选中这个框并成功登录之后会向用户的计算机上写入一个cookie该cookie默认的存续期是年你可以通过把Login控件的DisplayRememberMe和RememberMeSet属性设置为false来禁用这个选项查看示例的代码你可以发现这项事务并没有任何代码只设置了少许的几个属性这些控件的样式属性都是站点应用的样式表设置的
Loginaspx
<%@ Page Language=VB MasterPageFile=~/Sitemaster%>
<asp:Content ID=Content ContentPlaceHolderId=MainBody runat=server>
<asp:login ID=Login runat=server createuserurl=CreateUseraspx
createusertext=Create a New Account />
</asp:Content>
CreateUseraspx
<%@ Page Language=VB MasterPageFile=~/Sitemaster%>
<asp:Content ID=Content ContentPlaceHolderId=MainBody runat=server>
<asp:CreateUserWizard ID=CreateUserWizard runat=server
continuedestinationpageurl=Homeaspx/><br />
<a >Return to Default Home Page</a><br />
<a >Return to LoginView Home Page</a><br />
<a >Return to ChangePassword Home Page</a><br />
</asp:Content>
向认证用户显示不同的内容
下面的例子演示了使用LoginView控件为认证过的用户和匿名用户显示不同的内容尽管例子中没有显示什么但是LoginView控件支持基于用户角色来显示不同内容LoginView控件中的AnonymousTemplate模板包含了一个登录控件LoggedInTemplate模板包含了LoginName控件LoginName控件利用格式化字符串属性来显示欢迎和用户姓名请使用上一个例子中创建的帐号或重新创建一个帐号来登录站点并点击页面上方的登出链接
<%@ Page Language=VB MasterPageFile=~/Sitemaster%>
<asp:Content ID=Content ContentPlaceHolderId=MainBody runat=server>
<asp:loginview ID=LoginView runat=server>
<loggedintemplate>
<h>
<asp:loginname id=LoginName runat=server formatstring=Welcome {} />
</h>
</loggedintemplate>
<anonymoustemplate>
<h>Welcome to Login Controls</h>
<asp:login ID=Login runat=server
createuserurl=CreateUseraspx createusertext=Create a New Account />
</anonymoustemplate>
</asp:LoginView>
</asp:Content>
修改密码
在默认情况下ChangePassword控件要求用户通过了站点的认证才能更改他们的密码但是在下面的例子中我们把DisplayUserName属性设置为真其结果是用户在改变自己的密码之前可以由ChangePassword控件进行认证或者通过站点认证的用户输入不同的帐号来改变密码例子还链接到了创建用户页面使你能够创建有效的用户并测试示例
<%@ Page Language=VB MasterPageFile=~/Sitemaster%>
<asp:Content ID=Content ContentPlaceHolderId=MainBody runat=server>
<asp:ChangePassword ID=ChangePassword runat=server
createuserurl=CreateUseraspx createusertext=Create a New Account
canceldestinationpageurl=HomeChangePasswordaspx displayusername=true
continuedestinationpageurl=HomeChangePasswordaspx/>
</asp:Content>
使用成员和角色管理器API
成员特性是围绕两个核心类构建的Membership和MembershipUserMembership类提供创建用户(MembershipUser类处理)的方法以及通用的管理用户的方法用Membership类建立的用户是通过ASPNET应用程序认证的身份
Membership类执行的通用事务包括
◆创建新的MembershipUser
◆当用户试图登录的时候验证用户名-密码组合接下来你可以使用窗体认证来生成一个cookie表明用户登录了站点
◆ 检索MembershipUser实例
◆更新MembershipUser实例
◆根据不同的条件搜索用户
◆获取当前在线的通过认证的用户
◆在不需要用户的时候从系统中删除它
一旦你获取了MembershipUser实例就可以直接使用MembershipUser类执行下面的事务
◆访问应用程序中的MembershipUser类的属性
◆检索用户的密码(只有把成员特性配置为允许密码检索才可以使用)
◆改变或重置用户的密码
◆改变用户的密码提问和答案(如果成员特性被配置为在检索或更新密码之前提示用户密码问题和答案)
◆解锁那些因为密码错误或密码答案错误而被锁定的用户
角色管理器
角色管理器的核心类是Roles类Roles为创建角色和把用户指定给角色提供方法它也提供了用于管理角色信息的方法
使用Roles类可以执行的通用事务包括
◆创建新角色
◆删除已有的角色
◆把用户指定给角色
◆从角色中删除用户
◆检测某个用户是否获得了特定角色的授权
◆搜索特定角色中的用户检索角色中的所有用户
◆获取特定用户的角色信息
角色管理器特性也包含了HttpModule这个模块负责检索用户分配的角色并把这些信息存储在RolePrincipal内而它存在于页面的HttpContext中HttpContext中存在RolePrincipal使你能够利用<authorization>元素来保护页面和目录依据RolePrincipal中存储的角色信息用户只能获得站点内特定页面和目录的访问权
示例
下面的例子演示了在应用程序中如何使用成员 API
创建新用户
下面的例子演示了如何建立新的MembershipUser示例使用了MembershipCreateUser重载它返回一个状态参数其它的重载也可以使用他们会抛出异常而不是返回状态代码请注意在默认情况下成员特性要求密码至少有个字符长度并且密码至少包含一个非数字字符
<script runat=server>
Sub btnCreate_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim userName As String = txtUserIdText
这个值式加密的或散列过不会显示
Dim password As String = txtPasswordText
Dim email As String = txtEmailText
Dim passwordQuestion As String = ddlPasswordQuestionSelectedValue
这个值式加密的或散列过不会显示
Dim passwordAnswer As String = txtPasswordAnswerText
Dim result As MembershipCreateStatus
MembershipCreateUser(userName password email passwordQuestion
passwordAnswer True result)
lblResultsVisible = True
Select Case result
Case MembershipCreateStatusSuccess
txtUserIdText = Nothing
txtPasswordText = Nothing
txtEmailText = Nothing
ddlPasswordQuestionSelectedIndex =
txtPasswordAnswerText = Nothing
lblResultsText = User successfully created!
Case MembershipCreateStatusInvalidUserName
lblResultsText = The username format was invalid Please enter a different username
Case MembershipCreateStatusInvalidPassword
lblResultsText = The password was invalid:
A password cannot be an empty string and must also meet the pasword
strength requirements of the configured provider Please enter a new password
Case MembershipCreateStatusInvalidEmail
lblResultsText = The email format was invalid Please enter a different username
Case MembershipCreateStatusInvalidQuestion
lblResultsText = The password question format was invalid
Please enter a different question
Case MembershipCreateStatusInvalidAnswer
lblResultsText = The password answer format was invalid
Please enter a different answer
Case MembershipCreateStatusDuplicateUsername
lblResultsText = The username is already in use Please enter a new username
Case MembershipCreateStatusDuplicateEmail
lblResultsText = The email address is already in use
Please enter a different email address
Case Else
lblResultsText = An error occurred while creating the user
End Select
End Sub
</script>
用户登录和访问用户属性
下面的例子演示了用户使用MembershipValidateUser方法登录它还演示了在登录用户的时候如何同时使用窗体认证和成员特性在上面的例子中创建用户之后请在登录页面上输入凭证一旦你登录了你会被重定向到一个页面该页面利用MembershipGetUser来检索与登录用户相对应的MembershipUser实例同时请注意这个页面还显示了目录上设置的用户属性这些内容只有通过认证的用户才能访问点击页面底部的登出链接可以退出站点
<script runat=server>
Protected memUser As MembershipUser
Sub Page_Load(ByVal sender As Object ByVal e As SystemEventArgs)
memUser = MembershipGetUser()
End Sub
Sub linkLogout_Click(ByVal sender As Object ByVal e As SystemEventArgs)
FormsAuthenticationSignOut()
RolesDeleteCookie()
FormsAuthenticationRedirectToLoginPage()
End Sub
</script>
User Name/ID: <% = ServerHtmlEncode(memUserUsername) %>
Email:<% = ServerHtmlEncode(memUserEmail) %>
更新用户属性
请用前面建立的用户凭证登录页面会用ASPNET 中新的DetailsView控件显示用户属性DetailsView控件与一个数据源控件通讯在例子中ObjectDataSource控件检索MembershipUser实例的内容你可以点击页面底部的编辑链接使DetailsView进入编辑模式MembershipUser的电子邮件和注释都可以修改点击更新链接可以把新值保存到数据库请注意在代码中页面实现了ItemUpdating事件该事件是由ObjectDataSource引发的这样做是必要的MembershipUser类没有参数化构造函数它要求使用ObjectDataSource的双向数据绑定点击登出链接可以退出
Sub DetailsView_ItemUpdating(ByVal sender As Object
ByVal e as DetailsViewUpdateEventArgs)
必须手动处理更新操作因为MembershipUser 没有参数化的构造函数
Dim memUser as MembershipUser = MembershipGetUser()
memUserEmail = CStr(eNewValues())
memUserComment = CStr(eNewValues())
Try
MembershipUpdateUser(memUser)
eCancel = true
DetailsViewChangeMode(DetailsViewModeReadOnly)
Catch ex as Exception
ResponseWrite(<div>The following error occurred:<font color=red>
+ exMessage + </font></div>)
eCancel = true
End Try
End Sub
帐号锁定
Membership特性自动地跟蹤用户重试密码的次数在检索密码或重置密码的时候它也跟蹤密码重试的次数下面的例子演示了自动的帐号锁定能力以及如何取消帐号锁定首先使用前面的建立新用户示例创建一个新帐号接着点击下方的按钮运行帐号登出示例登录页面显示了显示了为了锁定帐号需要重试的失败次数在登录页面上使用你建立的第一个帐号并输入错误的密码请注意在重试的失败次数到了之后如果你使用了正确的密码也不能登录了这是因为在重试失败的次数到了一定的数量之后Membership特性自动地锁定的帐号为了解除该帐号的锁定请使用你建立的第二个帐号登录显示的页面与前面的显示用户属性的例子很相似但是这个页面允许你在页面底部输入任意的用户名称请输入被锁定的帐号并回车DetailsView控件会刷新并显示该用户的信息请注意标识锁定状态的检查框IsLockedOut是选中的LastLockoutDate也被更新了它显示了用户被锁定的日期点击页面底部的解锁按钮来解除当前显示的用户的锁它调用了MembershipUser实例的UnlockUser方法解除了用户的锁在解除用户的锁之后IsLockedOut检查框被清除了LastLockoutDate属性也被重置了点击页面底部的登出链接现在尝试用第一个帐号登录现在可以再次成功登录了
Sub btnUnlockUser_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim memUser as MembershipUser = MembershipGetUser(txtUserNameText)
If (Not memUser is Nothing And memUserIsLockedOut = true)
memUserUnlockUser()
End If
刷新被选中用户的信息
DetailsViewDataBind()
End Sub
删除用户
你可以使用MembershipDeleteUser方法删除用户下面的例子演示了如何使用窗体认证删除当前登录的用户并让该用户登出
<script runat=server>
Sub btnDeleteCurrentUser_Click(ByVal sender As Object ByVal e As SystemEventArgs)
If (MembershipDeleteUser(UserIdentityName)) Then
FormsAuthenticationSignOut()
RolesDeleteCookie()
ResponseRedirect(~/CreatingUsersaspx)
Else
lblResultVisible = True
lblResultText = The Membership user was not deleted
End If
End Sub
</script>
管理角色
下面的例子演示了认证用户如何使用角色管理器特性所有的示例页面都拒绝匿名用户访问在默认情况下ASPNET中是没有激活角色管理器特性的但是下面的例子中使用的nfig显式地激活了角色管理器特性
添加和删除角色
下面的例子演示了如何使用RolesCreateRole和RolesDeleteRole方法建立和删除角色在你建立角色或删除已有角色之后页面使用RolesGetAllRoles方法显示系统中的所有可用角色RolesGetAllRoles的返回值可以轻易地绑定到任何支持数据绑定的控件你至少需要建立一个叫做Administrators的角色
在你建立和删除角色的时候请注意角色管理器特性不允许你建立重复的角色同时还要注意在默认情况下角色管理器不允许你删除填充过的角色
Sub btnCreateRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim roleName As String = txtCreateRoleText
Try
RolesCreateRole(roleName)
lblResultsText = Nothing
lblResultsVisible = False
txtCreateRoleText = Nothing
Catch ex As Exception
lblResultsText = Could not create the role: + ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End Sub
Sub btnDeleteRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
If (lbxAvailableRolesSelectedIndex <> ) Then
Try
RolesDeleteRole(lbxAvailableRolesSelectedValue)
lblResultsText = Nothing
lblResultsVisible = False
Catch ex As Exception
lblResultsText = Could not delete the role: + ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End If
End Sub
向角色中添加用户和从角色中删除用户
下面的例子使用了前面例子中建立的角色它演示了如何向角色添加用户和从角色中删除用户使用RolesAddUserToRole方法向角色中添加用户使用RolesRemoveUserFromRole方法从角色中删除用户在给角色添加用户之前先检查该用户是否已经是该角色的成员这种检查是必要的因为如果你试图给角色多次添加同一个用户角色管理器会抛出异常在前面的例子中角色信息和角色的成员都显示在数据绑定控件中用户所属的角色列表通过RolesGetRolesForUser方法获取要运行下面的例子就要确保把你自己加入Administrators角色
Sub btnAddUserToRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
If (lbxAvailableRolesSelectedIndex <> ) Then
Dim selectedRole As String = lbxAvailableRolesSelectedValue
If Not RolesIsUserInRole(selectedRole) Then
Try
RolesAddUserToRole(UserIdentityName selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResultsText = Could not add the user to the role: +
ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
Else
lbxAvailableRolesSelectedIndex =
End If
End If
End Sub
Sub btnDeleteUserFromRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim selectedRole As String = lbxUserRolesSelectedValue
If (lbxUserRolesSelectedIndex <> ) Then
Try
RolesRemoveUserFromRole(UserIdentityName selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResultsText = Could not remove the user from the role: +
ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End If
End Sub
管理角色
下面的例子演示了认证用户如何使用角色管理器特性所有的示例页面都拒绝匿名用户访问在默认情况下ASPNET中是没有激活角色管理器特性的但是下面的例子中使用的nfig显式地激活了角色管理器特性
添加和删除角色
下面的例子演示了如何使用RolesCreateRole和RolesDeleteRole方法建立和删除角色在你建立角色或删除已有角色之后页面使用RolesGetAllRoles方法显示系统中的所有可用角色RolesGetAllRoles的返回值可以轻易地绑定到任何支持数据绑定的控件你至少需要建立一个叫做Administrators的角色
在你建立和删除角色的时候请注意角色管理器特性不允许你建立重复的角色同时还要注意在默认情况下角色管理器不允许你删除填充过的角色
Sub btnCreateRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim roleName As String = txtCreateRoleText
Try
RolesCreateRole(roleName)
lblResultsText = Nothing
lblResultsVisible = False
txtCreateRoleText = Nothing
Catch ex As Exception
lblResultsText = Could not create the role: + ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End Sub
Sub btnDeleteRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
If (lbxAvailableRolesSelectedIndex <> ) Then
Try
RolesDeleteRole(lbxAvailableRolesSelectedValue)
lblResultsText = Nothing
lblResultsVisible = False
Catch ex As Exception
lblResultsText = Could not delete the role: + ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End If
End Sub
向角色中添加用户和从角色中删除用户
下面的例子使用了前面例子中建立的角色它演示了如何向角色添加用户和从角色中删除用户使用RolesAddUserToRole方法向角色中添加用户使用RolesRemoveUserFromRole方法从角色中删除用户在给角色添加用户之前先检查该用户是否已经是该角色的成员这种检查是必要的因为如果你试图给角色多次添加同一个用户角色管理器会抛出异常在前面的例子中角色信息和角色的成员都显示在数据绑定控件中用户所属的角色列表通过RolesGetRolesForUser方法获取要运行下面的例子就要确保把你自己加入Administrators角色
Sub btnAddUserToRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
If (lbxAvailableRolesSelectedIndex <> ) Then
Dim selectedRole As String = lbxAvailableRolesSelectedValue
If Not RolesIsUserInRole(selectedRole) Then
Try
RolesAddUserToRole(UserIdentityName selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResultsText = Could not add the user to the role: + ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
Else
lbxAvailableRolesSelectedIndex =
End If
End If
End Sub
Sub btnDeleteUserFromRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim selectedRole As String = lbxUserRolesSelectedValue
If (lbxUserRolesSelectedIndex <> ) Then
Try
RolesRemoveUserFromRole(UserIdentityName selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResultsText = Could not remove the user from the role: +
ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End If
End Sub
用角色管理器对页面进行授权访问
这个例子的nfig文件包含了<authorization>元素它限制了示例只能让Administrators角色的成员访问请确保你已经建立了Administrators角色并把自己添加到了这个角色中一旦你称为Administrators角色的成员就可以访问示例页面了ASPNET提供了一个角色管理器HttpModule它自动地把RolePrincipal附加到当前请求的HttpContext上如果你是Administrators角色的成员当URL授权过程根据RolePrincipal执行IsInRole检查(URL授权过程调用RolePrincipalIsInRole)的时候该访问检查会返回true你就可以访问页面了请注意你可以通过调用PageUser并把结果转换RolePrincipal来引用页面中的RolePrincipal
<location path=administrators_role>
<systemweb>
<authorization>
<allow roles=Administrators />
<deny users=*/>
</authorization>
</systemweb>
</location>
编程检查授权
由于角色管理器特性把RolePrincipal附加到HttpContext上你也可以编写代码根据RolePrincipal执行访问检查你先建立两个角色Regular Users和Power Users把自己添加到这两个角色中当你运行示例的时候页面使用多种技术执行IsInRole检查有些访问检查使用了UserIsInRole它说明了使用正常的PageUser语法的时候RolePrincipal也是可用的这个页面还演示了如何把PageUser转换为RolePrincipal引用接着直接在RolePrincipal上调用IsInRole
<asp:Label ID=Label runat=server Text=<%# UserIsInRole(Administrators) %> />
<asp:Label ID=Label runat=server Text=<%# RolesIsUserInRole(Regular Users) %> />
<asp:Label ID=Label runat=server Text=<%#
(CType(UserRolePrincipal))IsInRole(Power Users) %> />