2016-11-28 18 views
1

我正在编写一个WPF应用程序并使用自定义主体实现自定义安全身份验证和授权,并且它工作得很好。我使用CaliburnMicro作为MVVM框架。而我使用它的设计模式的支持,所以在每次查看我:在设计模式下禁用类属性

xmlns:vm="clr-namespace:Project.ViewModels" 
xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro.Platform" 
cal:Bind.AtDesignTime="True" 
d:DataContext="{d:DesignInstance Type=vm:MyViewModel, IsDesignTimeCreatable=True}"> 

然后,当我在Visual Studio中工作,我可以查看和编辑我的控制,通过视图模型填充。这个问题,但是,是PrincipalPermission属性:

[PrincipalPermission(SecurityAction.Demand)] 
public class MyViewModel : Screen 

因为如果我将它设置,则该视图模型被限制(因此,只有合法的用户才能观看),它在运行时的伟大工程;在那里我检查并重定向到登录查看模型;但后来我失去了WPF编辑器的所有设计功能(因为设计编辑器显示空白屏幕)。如果我评论该属性,并清理/重建项目,那么编辑器再次工作;但这不是一个真正的选择,因为我有近70个视图,我们是一个由13个开发人员/设计师组成的组。

有没有办法可以限制只有在设计模式下才能设置的属性?那么我们可以设计/开发和测试,而无需手动评论70多个视图?

+0

您是否使用此属性来限制基于当前Windows用户的访问? – Evk

+0

@Evk no。我对现有的服务总线实施了自定义身份验证服务。但我正在使用框架内置机制。 –

回答

1

由于方式的CAS属性工作(涉及许可基本上嵌入导致在编译时DLL),你必须创建自己的PrincipalPermission,但它并不难,因为你可以代理所有的工作,以实际PrincipalPermission

[ComVisible(true)] 
[Serializable] 
public sealed class PrincipalPermissionProxy : IPermission, IUnrestrictedPermission 
{ 
    private readonly PrincipalPermission _inner; 
    public PrincipalPermissionProxy(PrincipalPermission inner) { 
     _inner = inner; 
    } 

    public IPermission Copy() 
    { 
     return _inner.Copy(); 
    } 

    public void Demand() { 
     // NOTE here we check if we are running under designer and if so - ignore demand 
     if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) 
      return; 
     _inner.Demand(); 
    } 

    public void FromXml(SecurityElement e) 
    { 
     _inner.FromXml(e); 
    } 

    public IPermission Intersect(IPermission target) 
    { 
     return _inner.Intersect(target); 
    } 

    public bool IsSubsetOf(IPermission target) 
    { 
     return _inner.IsSubsetOf(target); 
    } 

    public bool IsUnrestricted() 
    { 
     return _inner.IsUnrestricted(); 
    } 

    public SecurityElement ToXml() 
    { 
     return _inner.ToXml(); 
    } 

    public IPermission Union(IPermission target) 
    { 
     return _inner.Union(target); 
    } 
} 

然后我们复制PrincipalPermissionAttribute来回报广大许可(属性是非常简单的,我们只是完全复制):

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] 
[ComVisible(true)] 
[Serializable] 
public sealed class MyPrincipalPermissionAttribute : CodeAccessSecurityAttribute { 
    public string Name { get; set; } 

    public string Role { get; set; } 

    public bool Authenticated { get; set; } = true; 

    public MyPrincipalPermissionAttribute(SecurityAction action) 
     : base(action) { 

    } 

    public override IPermission CreatePermission() { 
     if (this.Unrestricted) 
      return new PrincipalPermissionProxy(new PrincipalPermission(PermissionState.Unrestricted)); 
     return new PrincipalPermissionProxy(new PrincipalPermission(this.Name, this.Role, this.Authenticated)); 
    } 
} 

,然后更换了所有的属性与MyPermissionAttribute(当然有一些花哨的名字:))和完成 - 设计师现在可以正常工作。

注意当你用WPF设计器进行测试时 - 不仅仅是重建项目,而是所有的XDesProc.exe进程(这些都是WPF设计器的进程)的kill

+0

谢谢@Evk,我会尽力让你知道。 –