7

与所有业务线应用程序一样,一个应用程序可能有多个Users,其中一些Roles分配给了它们。我们最近转移到 WPF MVVM 架构,并寻找为每个登录用户分配角色的最佳方式。互联网上漂浮着许多术语,例如身份验证、角色管理器、登录服务等,但我不确定使用哪个术语。

这是我们所拥有的:

在单个项目中开发的小型企业应用程序(包含 20 个表单)。我们使用MVVM架构,LINQ-to-SQL如 DataAccess 和Model,withRepository patternUnit Of Work

我们想要什么:

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

那么我们如何才能做到这一点;什么样的服务可以用于在桌面 LOB 应用程序中使用 MVVM 架构来执行这个完整的机制。技术术语或教程链接会有所帮助。

我希望我很清楚,并提前非常感谢你。

编辑: 我浏览了很多论坛和文章,但它们都专注于 ASP.NET。仍然找不到在 WPF 中分配角色的具体实现。并且 ASP.NET 上的源代码不符合 WPF。

4

5 回答 5

4

我建议围绕ASP.NET 成员资格角色管理提供程序构建一个解决方案(尽管对您的原始问题进行了编辑)。它们在 MSDN 上有很好的记录并且非常灵活。

以下是一些链接,希望可以帮助您进行 WPF 集成:

另外,您提到您正在使用 MVVM;我建议拥有一个集中式授权类实例的静态类或其他可全局访问的属性(请参阅:使用全局变量的 WPF 应用程序)。然后可以从应用程序中的任何位置(即在 ViewModel 中)调用此类的方法,以根据授予用户的任何权限启用/禁用或显示/隐藏适当的功能。

于 2012-11-08T07:36:51.350 回答
3

看看微软的安全应用程序块。我已经将它应用到一个听起来和你的有点相似的应用程序中。权限可以存储在 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

于 2012-11-09T06:49:44.300 回答
0

我要做的是在客户端层创建一个包含当前用户信息(角色、权限等)的静态类。例如,这些权限可以通过枚举或类似的东西建模,然后在每个 ViewModel 中,您可以定义需要哪些枚举值,例如执行查询(查看记录)或执行保存或编辑命令。

于 2012-11-06T20:24:45.110 回答
0

我只需在每个命令中放置一个RequiredRole 属性,并添加一个CanExecute 覆盖,以检查当前用户是否有权执行此操作。这对于命令来说已经足够了。

另一方面,必须在您的屏幕指挥/选项卡主机/...中检查显示表单的权限

使用 Linq to Sql 获取角色和每个 suer 角色,就结束了。我不会为这样一个简单的任务集成外部代码而烦恼。

如果您想让它更通用,请在您的数据库中保留一个链接命令/表单和角色的表,并使用反射来授权用户。

我希望你会发现这很有用

于 2012-11-07T17:28:50.967 回答
0

我们使用 AD 来确定用户所属的角色。然后检查任何角色是否具有正确的权限。但是,您可以使用rolesanduserroles表自己完成这部分。

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

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

第一个有一个Id, an order, the和 the Title,以及其他一些字段。Image 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可以访问用户权限,并确定他们是否具有任何操作的权限。

它仍在进行中,因此有兴趣了解这里提出的其他建议。

于 2012-11-07T18:09:26.233 回答