2016-11-28 93 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,我會盡力讓你知道。 –