【问题标题】:How to manipulate WPF GUI based on user roles如何根据用户角色操作 WPF GUI
【发布时间】:2009-06-19 17:48:21
【问题描述】:

我正在使用 .NET 的 IIdentity 和 IPrincipal 对象来实现基于角色的安全性,并且我正在根据当前用户拥有的角色修改显示的控件。

我的问题是在 WPF 窗口中启用/禁用字段的推荐方法是什么 - 显示/隐藏依赖于 IIdentity.IsInRole 类型调用的字段。

这可以在 XAML 中完成,还是我必须将其抽象为代码,我认为后面的代码有点混乱;

this.txtUserName.IsReadOnly = !MyPrincipal.CurrentPrincipal.IsInRole("Administrator");
this.mnuCreateUser.Visibility = MyPrincipal.CurrentPrincipal.IsInRole("Administrator");
 ? Visibility.Hidden : Visibility.Visible;

(注意;我的代码在执行函数时检查角色,我要做的是根据角色修改 GUI,因此用户看不到/看到他们无权访问的只读元素)

【问题讨论】:

    标签: c# wpf security xaml identity


    【解决方案1】:

    虽然之前的答案会起作用,但对我来说,检测逻辑对象中的可见性看起来有点难看。我会为此使用转换器...

    <Control Visibility={Binding Path=CurrentPrincipal, Converter={StaticResource RoleToVisibilityConverter}, ConverterParameter=Administrator}/>
    

    然后是转换器本身

    public class RoleToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var principal = value as Principal;
            if(principal != null) {
                return principal.IsInRole((string)parameter) ? Visibility.Visible : Visibility.Collapsed;
            }
    
            return null;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
             throw new NotImplementedException();
        }
    }
    

    【讨论】:

    • 啊,这很合我的胃口。使用 XAML 中的这一点,应该可以直接看到在 GUI 中查看不同元素所需的访问权限。谢谢。
    • 各位刷码的朋友,你可能需要在“new NotImplementedException();”之前加上“return”
    • 我可能会在最后返回 Visibility.Visible 或 Visibility.Collapsed 而不是 null,具体取决于您是否希望匿名用户能够查看该项目。 (我选择了 Visibility.Collapsed)。
    • 我编辑了这一行:var principal = value as Principal;阅读: var principal = value as IPrincipal;另请注意,您需要引用 System.Security 和“使用 System.Security.Principal;”声明
    • 如果多个角色对特定控件具有相同的可见性设置怎么办?你怎么能发送多个 ConverterParameters 例如ConverterParameter=Admin,Developer?
    【解决方案2】:
    <Control Visibility={Binding ElementName=ThisWindow, Path=AdministratorVisibility, Mode=OneWay}/>
    

    在您的 C# 代码中:

    public Visibility AdministratorVisibility
    {
        get 
        { 
            MyPrincipal.CurrentPrincipal.IsInRole("Administrator") ? Visibility.Hidden : Visibility.Visible; 
        }
    }
    

    您可以为IsReadOnly 执行相同的操作。如果用户的角色可以改变(我不确定这些用户角色是如何工作的),您可以实现INotifyPropertyChanged 并执行NotifyPropertyChanged("AdministratorVisibility"),否则您可能会将BindingMode 更改为BindingMode.OneTime 并跳过实现通知。

    这可能并不比你已经在做的好很多,但它可能和你将要得到的一样好。

    【讨论】:

    • 感谢您的回复。我使用的角色仅在关闭和重新打开应用程序时更新,因此 NotifyPropertyChange 并不重要。我考虑过这种方法,但希望存在更直接的东西——有点像可以在方法上使用的角色属性语法。
    猜你喜欢
    • 2011-01-26
    • 2020-03-24
    • 2011-10-22
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2011-12-23
    相关资源
    最近更新 更多