与所有业务线应用程序一样,应用程序可能有多个Users
,并为其分配了一些Roles
。我们最近转向WPF MVVM架构,并寻找为每个登录用户分配角色的最佳方法。互联网上有许多术语,例如Authentication,RoleManager,LoginService等,但我不确定该解决哪些问题。
以下是我们的内容:
在单个项目中开发的小型企业应用程序(具有20个表单)。我们使用MVVM
架构,LINQ-to-SQL
作为DataAccess,使用Model
,Repository pattern
和Unit Of Work
。
我们想要什么:
有不同的表单,每个表单都有插入,更新,删除,打印等操作。我们想要的是根据他的角色限制登录用户 - 他可以执行的任务。例如,例如管理员可以自由地做任何"使用该应用程序,而某些其他用户可能不被允许查看某些表单或执行某些操作(即更新或删除)。
那么我们怎样才能做到这一点;在桌面LOB应用程序中使用MVVM体系结构可以使用何种服务来执行此完整机制。技术术语或教程链接将有所帮助。
我希望我很清楚并且非常感谢你。
编辑:我浏览了很多论坛和文章,但所有这些都专注于ASP.NET。仍无法找到WPF中角色分配的具体实现。 ASP.NET上的资源并不能很好地符合WPF。
答案 0 :(得分:4)
我建议围绕ASP.NET Membership& Role Management个提供商(尽管您对原始问题进行了修改)。它们在MSDN和MSDN上都有很好的文档记录。非常灵活。
以下是一些有助于WPF集成的链接:
另外,你提到你正在使用MVVM;我建议有一个静态类,或者是一个集中授权类实例的全局可访问属性(参见:WPF Application using a global variable)。然后可以从应用程序中的任何位置(即在ViewModels中)调用此类的方法,以根据授予用户的任何权限启用/禁用或显示/隐藏相应的功能。
答案 1 :(得分:3)
查看Microsoft的安全应用程序块。我已经将它应用到听起来与你的有点相似的应用程序中。权限可以存储在Active Directory,SQL甚至是平面文件中。
http://msdn.microsoft.com/en-us/library/ff664771(v=pandp.50).aspx
http://msdn.microsoft.com/en-us/library/ff664559(v=pandp.50).aspx
答案 2 :(得分:0)
我要做的是在客户端层创建一个静态类,其中包含当前用户的信息(角色,权限等)。这些权限可以通过例如enum或类似的方式建模,然后在每个ViewModel中,您可以定义哪些枚举值是必需的,例如执行查询(查看记录)或执行保存或编辑命令。
答案 3 :(得分:0)
我只需在每个命令中添加一个RequiredRole属性,并添加一个CanExecute覆盖,检查当前用户是否有权这样做。这对命令来说已经足够了。
另一方面,必须在屏幕导体/标签主机/ ...中检查显示表格的权利。
将Linq的角色和每个角色获取到Sql,结束了。我不打算为这么简单的任务集成外部代码。
如果您想使其更通用,请在数据库中保留一个链接命令/表单和角色的表,并使用反射来授权用户。
我希望你能找到有用的
答案 4 :(得分:0)
我们使用AD来确定用户所属的角色。然后检查任何角色是否具有正确的权限。但是,您可以使用roles
和userroles
表来自己完成此部分。
使用这两种方法中的任何一种,用户都将处于一组角色中。这是第一步。
然后,您需要在操作点验证用户是否具有权限。
我们的菜单结构是从数据库中动态构建的,因此我有一个MenuItems
表,然后是一个定义RoleMenuAvailability
的表。
第一个包含Id
,order
,Title
,Image source
和navigation target
以及其他一些字段。
第二个包含RoleId
和menuId
以及是否可编辑。
所以行的存在意味着它的可读性(如果是导航目标即表格)
然后从数据库中读取菜单项:
var usersItems =
items.Where(i => i.RoleMenuAvailabilities
.Any(r => domainUser.IsInDomainRole(r.UserRole.Description)))
.OrderBy(m => m.MenuOrder);
在我们的例子中, UserRole.Description
是AD角色的名称,IsInDomainRole
是辅助函数:
public bool IsInDomainRole(string role)
{
var regex = new Regex("[^\\\\]+$");
string name = this.Name ?? string.Empty;
string domainRole = regex.Replace(name, role);
return this.IsInRole(domainRole);
}
如果需要,可以扩展rolemenuavailability
表以在其上添加其他标记以进行删除,更新,添加等。
我们还没有完全实现下一个阶段,但目的是我们将对用户缓存用户权限。我们的ViewModel基类具有对用户的引用,因此可以调用CanEdit(int permissionId)
函数。然后,基本上控制可见性的属性或命令CanExecute
可以访问用户权限,并查明他们是否拥有该操作的权限。
这仍然是一项正在进行中的工作,所以有兴趣看看这里有什么其他建议。