在ASP.NET中使用角色

时间:2010-07-02 11:34:22

标签: asp.net

在asp.net Web应用程序中,我根据其角色限制了用户操作,如下所示

我在数据库中创建了三个表

表:用户

UserID Username Password
1 Bob password1
2 Scott password2
3 Jisun password3
4 Sam password4
5 John password5

表:组

GroupID Name
1 Administrators
2 Clerk
3 Manager
4 Cashier

表:角色

UserID GroupID
1 1
2 2
2 3
3 4
4 3
4 4

在Global.asax文件中,我写了以下内容

Sub Application_AuthenticateRequest(sender As Object, e As EventArgs)
    If Request.IsAuthenticated Then
        'Determine this user's roles
        Dim reader As SqlDataReader = _
              SqlHelper.ExecuteReader(connection string, _
              CommandType.StoredProcedure, "rolesForUser", _
              New SqlParameter("@Username", User.Identity.Name))

        ' Create an array of role names
        Dim roleList As New ArrayList
        Do While reader.Read()
            roleList.Add(reader("Name"))
        Loop

        'Convert the roleList ArrayList to a String array
        Dim roleListArray As String() = roleList.ToArray(GetType(String))

        'Add the roles to the User Principal
        HttpContext.Current.User = _
             New GenericPrincipal(User.Identity, roleListArray)
    End If
End Sub

在asp.net代码隐藏文件中有以下代码

If User.IsInRole("Administrator") then
  ' Display sensitive material
ElseIf User.IsInRole("Clerk") then
  ' Display moderately sensitive material
Else
  ' Display only bland material
End If

截至目前它工作正常。现在一个新的要求已经提出允许职员访问管理员所执行的一些(但不是全部)功能。

我是否需要更改源代码以提供以上新要求?

如果将来要求这样的要求,我是否需要一次又一次地做同样的事情?

或者我能做的更好的方式请建议我。

6 个答案:

答案 0 :(得分:2)

正如罗宾日所说,你将要改变的不是你实施的角色范式,而是“职员”可以访问的特定功能。这些更改将发生在您定义的任何地方(代码隐藏,内联代码,类等),以及职员正在执行的操作。

我的下一个问题与职员功能本身无关,但你看过ASP.NET Membership(和SqlRoleProvider)及其角色实现吗?

答案 1 :(得分:1)

您应该更改的代码是asp.net代码隐藏文件。

这应该用于向“职员”显示他们需要的其他信息。

你不应该把职员的职权提升到管理员的职权范围,只要给职员他们应该拥有的权利。

答案 2 :(得分:1)

ASP.NET从2.0版开始就是标准开箱即用功能的重要组成部分,它允许您使用成员资格和角色。有关如何使用标准功能的一些很好的资源:ASP.NET security tutorials

如果您已经拥有旧数据库,则可以轻松创建自定义提供程序并将其插入。例如custom membership provider

如果您关心拥有多个数据库,可以查看这篇文章:Create Membership tables in another database than the standard aspnetdb.mdf

答案 3 :(得分:0)

我强烈建议您花一天的时间来研究自定义ASP.NET成员资格和角色提供程序的功能。当正确使用成员资格时,所以许多任务都在“引擎盖下”完成。 您可以使用单行保护整个页面,单个导航节点(使用SiteMapProvider)甚至单个控件。

答案 4 :(得分:0)

您需要从应用程序代码中分离您的角色成员身份(您已将其称为 groups ),然后转到permission-based authentication model。这将允许您根据建议更改每个组的权限,因为将来的需求会发生变化。

如果要使用当前数据模型实现此目的,则需要创建一个新的权限表,该表通过多对多表与您的组相关联。您应该只检查应用程序代码中的权限而不是 group 成员身份。您可以直接通过多对多表修改哪些组具有哪些权限,或者在顶部放置一个简单的管理界面。

答案 5 :(得分:0)

除了使用管道代码的现有实现(例如成员资格提供程序)之外,添加额外的抽象级别以使解决方案不那么脆弱可能是明智的。如果授权范围很广,最好将角色映射到功能,并在代码中检查用户的任何角色是否可以访问某个功能。

  If Authorizer.UserHasAccessToFunctionality(user, "Sensitive") Then
    ' Display sensitive material     
  Else If ...

伪代码中的授权逻辑:

public Shared Function UserHasAccessToFunctionality(user as IPrincipal, _
   functionality as string) as Boolean
     functionalities = Authorizationrepository.GetFunctionalityForRoles(user.Roles)
     Return functionalities.Contains(functionality)
  End Function

AuthorizationRepository将加载一组角色可以访问的功能。

在数据库中,您可以将功能映射到可以访问它们的角色

表:功能性

ID Name
1  Sensitive
2  Protected
3  Public

表:RoleFunctionalities

Role Functionality
1    1
1    2
2    2
3    3