C# 如何基于用户角色操作WPF GUI

C# 如何基于用户角色操作WPF GUI,c#,wpf,security,xaml,identity,C#,Wpf,Security,Xaml,Identity,我正在使用.NET的IIdentity和IPrincipal对象来实现基于角色的安全性,并且我正在根据当前用户的角色修改显示的控件 我的问题是,在WPF窗口中启用/禁用字段的建议方法是什么-显示/隐藏依赖于IIdentity.IsInRole类型调用的字段 这可以在XAML中完成吗,或者我必须用我认为有点混乱的代码将其抽象成代码 this.txtUserName.IsReadOnly = !MyPrincipal.CurrentPrincipal.IsInRole("Administrator"

我正在使用.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,这样用户就不会看到/看到他们无权访问的只读元素)

对于
IsReadOnly
的实现,您也可以做同样的事情。如果用户的角色可以更改(我不确定这些用户角色如何工作),您可以实现
INotifyPropertyChanged
并执行
NotifyPropertyChanged(“管理员可见性”)
,否则您可能会将
BindingMode
更改为
BindingMode.OneTime
并跳过实现通知


这可能并不比您现在所做的要好多少,但它可能与您将要得到的一样好。

尽管前面的答案可行,但在我看来,在逻辑对象中检测可见性有点难看。我会用转换器

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

谢谢你的回复。我使用的角色仅在关闭和重新打开应用程序时更新,因此NotifyPropertyChange并不重要。我考虑过这个方法,但希望有更直接的东西存在——比如可以在方法上使用的角色属性语法。啊,这非常符合我的喜好。在XAML中使用此功能,应该可以直接查看GUI中不同元素所需的访问权限。谢谢。代码浏览者,您可能需要在“new NotImplementedException();”之前添加“return”,我可能会返回Visibility.Visible结尾或Visibility.Collapsed而不是null,具体取决于您是否希望匿名用户能够查看该项目。(我选择了Visibility.Collapsed)我编辑了这行:var principal=value作为主体;读取:var principal=作为IPPrincipal的值;还请注意,您将需要对System.Security的引用和“using System.Security.Principal;”语句如果多个角色对特定控件具有相同的可见性设置,该怎么办?如何发送多个ConverterParameter,例如
ConverterParameter=Admin、Developer
public Visibility AdministratorVisibility
{
    get 
    { 
        MyPrincipal.CurrentPrincipal.IsInRole("Administrator") ? Visibility.Hidden : Visibility.Visible; 
    }
}
<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();
    }
}