ASP.NET 2.0中保证应用程序的安全(2)

上一篇 / 下一篇  2007-05-15 11:49:00 / 个人分类:网络实用技术

帐号锁定

  Membership特性自动地跟踪用户重试密码的次数。在检索密码或重置密码的时候,它也跟踪密码重试的次数。下面的例子演示了自动的帐号锁定能力,以及如何取消帐号锁定。首先使用前面的"建立新用户"示例创建一个新帐号。接着,点击下方的按钮运行"帐号登出"示例。登录页面显示了显示了为了锁定帐号需要重试的失败次数。在登录页面上,使用你建立的第一个帐号并输入错误的密码。请注意,在重试的失败次数到了之后,如果你使用了正确的密码,也不能登录了--这是因为在重试失败的次数到了一定的数量之后,Membership特性自动地锁定的帐号。为了解除该帐号的锁定,请使用你建立的第二个帐号登录。显示的页面与前面的显示用户属性的例子很相似。但是,这个页面允许你在页面底部输入任意的用户名称。请输入被锁定的帐号并回车。DetailsView控件会刷新并显示该用户的信息。请注意,标识锁定状态的检查框IsLockedOut是选中的。LastLockoutDate也被更新了,它显示了用户被锁定的日期。点击页面底部的"解锁"按钮来解除当前显示的用户的锁。它调用了MembershipUser实例的UnlockUser方法,解除了用户的锁。在解除用户的锁之后,IsLockedOut检查框被清除了,LastLockoutDate属性也被重置了。点击页面底部的登出链接。现在尝试用第一个帐号登录。现在可以再次成功登录了。

Sub btnUnlockUser_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim memUser as MembershipUser = Membership.GetUser(txtUserName.Text)
If (Not memUser is Nothing And memUser.IsLockedOut = true)
memUser.UnlockUser()
End If

'刷新被选中用户的信息
DetailsView1.DataBind()
End Sub

  删除用户

  你可以使用Membership.DeleteUser方法删除用户。下面的例子演示了如何使用窗体认证删除当前登录的用户并让该用户登出。

<script runat="server">
Sub btnDeleteCurrentUser_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If (Membership.DeleteUser(User.Identity.Name)) Then
FormsAuthentication.SignOut()
Roles.DeleteCookie()
Response.Redirect("~/CreatingUsers.aspx")
Else
lblResult.Visible = True
lblResult.Text = "The Membership user was not deleted."
End If
End Sub
</script>

 

管理角色

  下面的例子演示了认证用户如何使用角色管理器特性。所有的示例页面都拒绝匿名用户访问。在默认情况下,ASP.NET中是没有激活角色管理器特性的。但是,下面的例子中使用的web.config显式地激活了角色管理器特性。

  添加和删除角色

  下面的例子演示了如何使用Roles.CreateRole和Roles.DeleteRole方法建立和删除角色。在你建立角色或删除已有角色之后,页面使用Roles.GetAllRoles方法显示系统中的所有可用角色。Roles.GetAllRoles的返回值可以轻易地绑定到任何支持数据绑定的控件。你至少需要建立一个叫做"Administrators"的角色。

  在你建立和删除角色的时候,请注意角色管理器特性不允许你建立重复的角色。同时还要注意,在默认情况下,角色管理器不允许你删除填充过的角色。

Sub btnCreateRole_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim roleName As String = txtCreateRole.Text

Try
Roles.CreateRole(roleName)
lblResults.Text = Nothing
lblResults.Visible = False
txtCreateRole.Text = Nothing
Catch ex As Exception
lblResults.Text = "Could not create the role: " + Server.HtmlEncode(ex.Message)
lblResults.Visible = True
End Try
End Sub

Sub btnDeleteRole_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If (lbxAvailableRoles.SelectedIndex <> -1) Then
Try
Roles.DeleteRole(lbxAvailableRoles.SelectedValue)

lblResults.Text = Nothing
lblResults.Visible = False
Catch ex As Exception
lblResults.Text = "Could not delete the role: " + Server.HtmlEncode(ex.Message)
lblResults.Visible = True
End Try
End If
End Sub

  向角色中添加用户和从角色中删除用户

  下面的例子使用了前面例子中建立的角色,它演示了如何向角色添加用户和从角色中删除用户。使用Roles.AddUserToRole方法向角色中添加用户,使用Roles.RemoveUserFromRole方法从角色中删除用户。在给角色添加用户之前,先检查该用户是否已经是该角色的成员。这种检查是必要的,因为如果你试图给角色多次添加同一个用户,角色管理器会抛出异常。在前面的例子中,角色信息和角色的成员都显示在数据绑定控件中。用户所属的角色列表通过Roles.GetRolesForUser方法获取。要运行下面的例子,就要确保把你自己加入"Administrators"角色。

Sub btnAddUserToRole_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If (lbxAvailableRoles.SelectedIndex <> -1) Then
Dim selectedRole As String = lbxAvailableRoles.SelectedValue

If Not Roles.IsUserInRole(selectedRole) Then
Try
Roles.AddUserToRole(User.Identity.Name, selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResults.Text = "Could not add the user to the role: " + Server.HtmlEncode(ex.Message)
lblResults.Visible = True
End Try
Else
lbxAvailableRoles.SelectedIndex = -1
End If
End If
End Sub

Sub btnDeleteUserFromRole_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim selectedRole As String = lbxUserRoles.SelectedValue

If (lbxUserRoles.SelectedIndex <> -1) Then
Try
Roles.RemoveUserFromRole(User.Identity.Name, selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResults.Text = "Could not remove the user from the role: " + Server.HtmlEncode(ex.Message)
lblResults.Visible = True
End Try
End If
End Sub

用角色管理器对页面进行授权访问

  这个例子的web.config文件包含了<authorization>元素,它限制了示例只能让"Administrators"角色的成员访问。请确保你已经建立了"Administrators"角色并把自己添加到了这个角色中。一旦你称为"Administrators"角色的成员,就可以访问示例页面了。ASP.NET提供了一个角色管理器HttpModule,它自动地把RolePrincipal附加到当前请求的HttpContext上。如果你是"Administrators"角色的成员,当URL授权过程根据RolePrincipal执行IsInRole检查(URL授权过程调用RolePrincipal.IsInRole)的时候,该访问检查会返回true,你就可以访问页面了。请注意,你可以通过调用Page.User并把结果转换RolePrincipal来引用页面中的RolePrincipal。

<location path="administrators_role">
<system.web>
<authorization>
<allow roles="Administrators" />
<deny users="*"/>
</authorization>
</system.web>
</location>

  编程检查授权

  由于角色管理器特性把RolePrincipal附加到HttpContext上,你也可以编写代码根据RolePrincipal执行访问检查。你先建立两个角色"Regular Users"和"Power Users",把自己添加到这两个角色中。当你运行示例的时候,页面使用多种技术执行IsInRole检查。有些访问检查使用了User.IsInRole。它说明了使用正常的Page.User语法的时候,RolePrincipal也是可用的。这个页面还演示了如何把Page.User转换为RolePrincipal引用,接着直接在RolePrincipal上调用IsInRole。

<asp:Label ID="Label1" runat="server" Text=<%# User.IsInRole("Administrators") %> />
<asp:Label ID="Label2" runat="server" Text=<%# Roles.IsUserInRole("Regular Users") %> />
<asp:Label ID="Label3" runat="server" Text=<%# (CType(User,RolePrincipal)).IsInRole("Power Users") %> />


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-25  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 1999
  • 日志数: 101
  • 建立时间: 2006-11-29
  • 更新时间: 2008-07-28

RSS订阅

Open Toolbar