在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
截至目前它工作正常。现在一个新的要求已经提出允许职员访问管理员所执行的一些(但不是全部)功能。
我是否需要更改源代码以提供以上新要求?
如果将来要求这样的要求,我是否需要一次又一次地做同样的事情?
或者我能做的更好的方式请建议我。
答案 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