在代码隐藏中设置WPF UI权限

时间:2013-01-10 12:23:42

标签: wpf permissions

我希望看看我是否可以在WPF中执行以下操作:

用户打开WPF应用程序并使用用户AD名称,我将检查自定义数据库中的用户角色。这将类似于asp.net成员资格数据库。

根据用户角色,WPF将显示某些控件。

例如,如果我是管理员,那么我可以访问所有内容,但如果我是只读用户,那么我将无限制地访问该应用程序。

我知道我可以使用以下示例设置可见性:

public class RoleToVisibilityConverter : MarkupExtension,IValueConverter
{
    public RoleToVisibilityConverter()
    {

    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo                                 culture)
    {
        var principal = value as GenericPrincipal;
        bool IsValidUser = false;
        if (principal != null)
        {
            foreach (String role in parameter.ToString().Split(';'))
            {
                if (principal.IsInRole(role))
                {
                    IsValidUser = true;
                    break;
                }  
            }
            return IsValidUser ? Visibility.Visible : Visibility.Collapsed;
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

在XAML中,我为Visibility添加了以下绑定:

Visibility="{Binding Source={x:Static systhread:Thread.CurrentPrincipal}, ConverterParameter=admin;editor;readonly, Converter={rv:RoleToVisibilityConverter}}

但我想做的是不必在xaml中添加它。

我希望能够获得用户角色及其所有权限,并根据窗口加载UI权限。

原因是我希望能够在不必更改xaml的情况下更改只读角色可以看到/执行的操作。

有没有人知道这是否可能,如果是这样,最好的做法。

提前致谢。

诺尔

2 个答案:

答案 0 :(得分:2)

我相信“在Xaml中没有完成”几乎是不可能的,除非您愿意为每个不同的权限创建不同的视图,并且在导航期间定位相应的用户权限页面。

否则......你能做的最好的事情就是创造一种风格。此样式将以基本控件为目标,并在定义内创建一个数据触发器,该触发器将打开/关闭visiblity或IsEnabled或两者。这样,样式可以存在于所有xaml页面的一个中心位置,并且每个需要权限标记的控件都可以通过简单地遵循该样式来实现。

另一个好处是您可以根据需要绑定不同的场景。例如,下面的样式在数据上下文中设置了不同的布尔值。一个人可能能够查看但不能编辑,因此该用户的IsEnabled设置为false,而允许管理员同时执行这两个操作,而不可查看的标记用户甚至看不到该控件。

<Style x:Key="PermissionStyle" TargetType="{x:Type Control}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=ViewOnly}" Value="True">
            <Setter Property="Visibility" Value="Visible" />
            <Setter Property="IsEnabled" Value="False" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=IsAdmin}" Value="True">
            <Setter Property="IsEnabled" Value="True" />
            <Setter Property="Visibility" Value="Visible" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=NotVisible}" Value="True">
            <Setter Property="IsEnabled" Value="False" />
            <Setter Property="Visibility" Value="Hidden" />
        </DataTrigger>            
    </Style.Triggers>
</Style> 

答案 1 :(得分:1)

如果您使用的是MVVM,那么您的视图模型应具有public bool IsXXXAllowed { get; private set; }等属性。在实例化视图模型时,您应该查询用户是否具有使用XXX功能所需的最低权限,并相应地设置属性的值。理想情况下,权限检查应该与角色无关,因为可以为嵌套等用户创建角色。您可以使用fn_my_permissions直接查询表的权限。

然后在视图中,只需绑定相关控件的IsEnabled属性(或Visibility属性{或BooleanToVisibilityConverter属性)(如果有更多,则绑定控件的Grid而不是一个控件)到IsXXXAllowed属性。