2016-11-28 1 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}"> 

을 그리고, 내가 비주얼 스튜디오에서 일하고 있어요 때보기 및보기 모델에 의해 채워 내 컨트롤을 편집 할 수 있습니다. 문제는, 그러나, PrincipalPermission 속성입니다 :

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

때문에 내가 다음보기 모델이 제한됩니다 (그래서 인증 된 사용자 만 볼 수 있음)과 런타임에 위대한 작품을 설정하면, 내가 그것을 확인하고 로그인 View Model로 리다이렉트한다. 하지만 WPF 편집기의 모든 디자인 기능을 잃었습니다 (디자인 편집기에 빈 화면이 표시되기 때문에). 해당 속성에 주석을 달고 프로젝트를 정리/다시 작성하면 편집기가 다시 작동합니다. 하지만 거의 70 개의 뷰가 있고 우리는 13 명의 개발자/디자이너로 구성된 그룹이므로 실제 옵션이 아닙니다.

디자인 모드가 아닌 경우에만 속성을 설정하도록 제한 할 수 있습니까? 따라서 우리는 70 개 이상의 뷰를 수동으로 언급하지 않고도 설계/개발 및 테스트 할 수 있습니까? 길의 그 CAS 일 (관련 권한이 기본적으로 컴파일시에 DLL을 결과에 포함) 속성 때문에

+0

이 속성을 사용하면 현재 Windows 사용자를 기반으로 액세스를 제한 할 수 있습니까? – Evk

+0

@Evk no. 기존 서비스 버스에 대한 사용자 지정 인증 서비스를 구현했습니다. 하지만 프레임 워크에 내장 된 메커니즘을 사용하고 있습니다. –

답변

1

, 당신은 당신의 자신의 PrincipalPermission을 만들어야합니다,하지만 당신은 프록시 실제 PrincipalPermission 모든 작업을 할 수 있기 때문에, 어렵지 않다 : 그런 다음

[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)); 
    } 
} 

모든 속성을 대체 :

[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 복사 MyPermissionAttribute (약간의 화려한 이름이있는 것은 물론 :)) 그리고 완료 - 디자이너가 이제는 정상적으로 작동합니다.

프로젝트를 다시 컴파일하는 것이 아니라 모든 XDesProc.exe 프로세스 (WPF 디자이너의 프로세스 임)를 삭제할 때 WPF 디자이너로 테스트 할 때주의하십시오.

+0

감사합니다. @Evk, 알려 드리겠습니다. –