.net - Wpf 用户安全策略

标签 .net wpf security mvvm mvvm-light

背景:

我正在创建一个 WPF 应用程序(带有 MVVM-Light 的 .NET 4.5)

我在支持 WPF 应用程序的数据库中创建了用户角色,其中 WPF 应用程序的用户具有分配的角色(即 用户、经理、所有者、管理员)

我想要什么:

我的客户希望能够根据用户的角色限制用户看到的内容和可以执行的操作。所有用户都会看到一些 View ,因此应根据用户角色隐藏或禁用一些视觉元素(网格、按钮等)。

我有什么:

我创建了一个 IUserService,它被注入(inject)到每个 View 模型中。我创建的角色有一个标记其安全级别的字段(只是一个从 1 到 5 的整数)。我希望能够根据这个数字限制视觉元素的可见性。

例如,我的计划是将元素的可见性绑定(bind)到 View 模型(Level1、Level2 等)中的 bool 属性(使用 boolToVisibility 转换器),如果用户级别匹配或更高,该属性将返回 true比属性级别。

我的担忧:

我担心的是,要在每个 View 模型和每个需要的视觉元素上执行大量工作。此外,我已经有了一些受其他业务逻辑影响的视觉元素。

问题:

根据用户角色策略限制用户“查看”视觉元素的能力的有效方法是什么?

我准备开始这项工作,但我很想听听社区关于如何在 WPF 应用程序中实现基于用户角色的安全性的其他想法。

最佳答案

您可以创建一个 attached property确定每个控件的访问级别

public class VisibilitySecurityLevel 
{
    public static readonly DependencyProperty SecurityLevelProperty = 
        DependencyProperty.RegisterAttached("SecurityLevel", typeof(int), typeof(FrameworkElement), new PropertyMetadata(5));

    public static void SetSecurityLevel(UIElement element, int value)
    {
        element.SetValue(SecurityLevelProperty, value);
    }
    public static int GetSecurityLevel(UIElement element)
    {
        return (int)element.GetValue(SecurityLevelProperty);
    }
}

将其应用到您希望由用户角色管理的控件

    <Button local:VisibilitySecurityLevel.SecurityLevel="3"/>
    <CheckBox local:VisibilitySecurityLevel.SecurityLevel="2"/>

使用一个基本的隐式样式,该样式将使用转换器根据它们的安全级别绑定(bind)控件的可见性

       <local:AccessLevelToVisibilityConverter x:Key="AccessLevelToVisibilityConverter"/>
       <Style TargetType="{x:Type FrameworkElement}">
            <Setter Property="Visibility">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource AccessLevelToVisibilityConverter}">
                        <Binding Path="UserRole"/>
                        <Binding RelativeSource="{RelativeSource Mode=Self}"/>
                    </MultiBinding>
                </Setter.Value>
            </Setter>
        </Style>

转换器:

public class AccessLevelToVisibilityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        int userRole = (int)values[0];
        int controlAccessLevel = (int)(values[1] as FrameworkElement).GetValue(VisibilitySecurityLevel.SecurityLevelProperty);

        return (userRole <= controlAccessLevel) ? Visibility.Visible : Visibility.Hidden;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

请注意,在我的实现中,最低用户角色 5 是最受限制的角色(只能看到访问级别为 5 的控件),用户角色 1 是最有特权的(可以看到访问级别 1 -5 的控件)。 这就是默认访问级别为 5 (new PropertyMetadata(5)) 和 转换器绑定(bind)到 viewModel 中的整数 UserRole 属性,指示用户的访问权限 (1 - 5)

希望对你有帮助

关于.net - Wpf 用户安全策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19206263/

相关文章:

c# - 从 json 反序列化 protected 构造对象

c# - 如何在 TreeView 中获取原始值?

c# - 在 MVVM 应用程序中切换 ViewModel 时出现 BindingExpression 路径错误

Java Applet 网络 URL 连接用户名和密码在 Java 控制台中可见

c# - 无法在 .NET 标准库项目中从 NuGet 安装 log4net

.net - 在 WPF 中加载后锁定的图像文件

.net - 站点使用 SSL,但是 JSON 查询呢?

wpf - 在 wpf 3D 中创建可点击的点状结构

c - X Window 系统中的一个老缺陷。它是如何工作的?

.net - .NET 4.5 中的默认安全协议(protocol)