为应用程序用户分配角色

时间:2012-11-03 05:48:55

标签: c# wpf wcf mvvm user-roles

与所有业务线应用程序一样,应用程序可能有多个Users,并为其分配了一些Roles。我们最近转向WPF MVVM架构,并寻找为每个登录用户分配角色的最佳方法。互联网上有许多术语,例如Authentication,RoleManager,LoginService等,但我不确定该解决哪些问题。

以下是我们的内容:

在单个项目中开发的小型企业应用程序(具有20个表单)。我们使用MVVM架构,LINQ-to-SQL作为DataAccess,使用ModelRepository patternUnit Of Work

我们想要什么:

有不同的表单,每个表单都有插入更新删除打印等操作。我们想要的是根据他的角色限制登录用户 - 他可以执行的任务。例如,例如管理员可以自由地做任何"使用该应用程序,而某些其他用户可能不被允许查看某些表单或执行某些操作(即更新或删除)。

那么我们怎样才能做到这一点;在桌面LOB应用程序中使用MVVM体系结构可以使用何种服务来执行此完整机制。技术术语或教程链接将有所帮助。

我希望我很清楚并且非常感谢你。

编辑:我浏览了很多论坛和文章,但所有这些都专注于ASP.NET。仍无法找到WPF中角色分配的具体实现。 ASP.NET上的资源并不能很好地符合WPF。

5 个答案:

答案 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来确定用户所属的角色。然后检查任何角色是否具有正确的权限。但是,您可以使用rolesuserroles表来自己完成此部分。

使用这两种方法中的任何一种,用户都将处于一组角色中。这是第一步。

然后,您需要在操作点验证用户是否具有权限。 我们的菜单结构是从数据库中动态构建的,因此我有一个MenuItems表,然后是一个定义RoleMenuAvailability的表。

第一个包含IdorderTitleImage sourcenavigation target以及其他一些字段。

第二个包含RoleIdmenuId以及是否可编辑。 所以行的存在意味着它的可读性(如果是导航目标即表格) 然后从数据库中读取菜单项:

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可以访问用户权限,并查明他们是否拥有该操作的权限。

这仍然是一项正在进行中的工作,所以有兴趣看看这里有什么其他建议。