2009-11-30 3 views
1

현재 내가 직면하고있는 도전 과제에 대한 정보를 찾고 있습니다.MVVM은 웹 서비스를 인식합니다.

내 시스템에서 제공하는 일부 WCF 서비스를 호출하려는 사용자를 식별하는 데 사용하는 사용자 지정 WIF STS를 구축했습니다. WCF 서비스는 호출자에게 주어진 서비스를 호출하는 데 필요한 클레임이 있는지 여부를 결정하는 사용자 지정 권한 관리자를 사용합니다.

이제 WPF 앱을 만들고 있습니다. 그 WCF 서비스의 위에. 보기 모델이 모델을 구현하는 보호 된 WCF 서비스를 호출하도록 MVVM 패턴을 사용하고 있습니다. 현재 직면하고있는 도전 과제는 현재 사용자가 실제로 호출하지 않고 웹 서비스 메서드를 성공적으로 호출 할 수 있는지 여부를 알 수 없다는 것입니다. 기본적으로, 내가 달성하고자하는 것은 메소드를 성공적으로 호출 할 수있는 능력을 기반으로 UI의 특정 부분을 활성화/비활성화하는 것입니다.

내가 지금까지 생각해 낸 최상의 솔루션은 사용자 지정 권한 정책 관리자가 사용자가 주어진 메서드를 호출 할 수 있는지 여부를 결정할 수있는 동일한 비즈니스 논리를 기반으로하는 서비스를 만드는 것입니다. 이제이 메소드는 문자열, 실제로 ServiceAddress와 Method (Action)의 두 문자열로이 서비스에 전달되어야하며,이 입력을 기반으로 서비스는 현재 사용자에게 액세스 권한이 필요한지 여부를 결정할 수 있습니다 방법. 분명히 이것이 작동하려면이 서비스 자체가 동일한 STS의 발급 된 토큰을 요구해야하며 동일한 청구를 통해 해당 작업을 수행해야합니다.

과거에 비슷한 일을 한 사람이 있습니까? 아니면이 작업을 수행하는 데 좋은 아이디어가 있습니까? 사전에

감사합니다,

클라우스

답변

1

이것은 당신이 당신의 서비스를 필요로하고 어떤 주장에 조금 따라 달라집니다.

서비스에 동일한 클레임이 필요한 경우 클레임을 확인하고 미리 호출하는 서비스를 만드는 것이 좋습니다. 이렇게하면 사용자에게 "사전 권한 부여"권한을 부여하여 UI의 해당 부분을 활성화/비활성화 할 수 있습니다. 실제 서비스에 전화 할 때가되면 사용자는 마음대로 전화를 걸 수 있으며 이미 안전하다는 것을 확인한 것입니다.

서비스가 모두 다른 클레임 집합을 필요로하고 사전에 작동하는지 쉽게 확인할 수있는 방법이없는 경우 사용자가 전화를 걸어 일반 예외 처리를 통해 처리하도록합니다. 이것은 사용자가 시도 (및 실패) 한 다음 사용하지 못하게해야하기 때문에 좀 더 까다로워 질 것입니다.

그렇지 않으면 제안 된 것과 같은 작업을 수행 할 수 있습니다. 특정 사용자를 위해 쿼리 할 수있는 카탈로그 형태로 만들 수 있습니다. 주소/메소드를 전달하는 것 외에도 주소를 전달하고 허용 된 (또는 허용되지 않는, 둘 중 더 작은 것) 메소드 전체를 검색 할 수 있도록하는 것이 더 좋을 수 있습니다. 이렇게하면 인증을 위해 왕복을 줄일 수 있습니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 모든 서비스 방법에는 잠재적으로 다른 주장이 필요하므로 마지막 제안은 내가 원하는 것일 수 있습니다. 이제, 내 뷰 모델이 계약 IService1로 서비스를 호출한다고 가정 해 보겠습니다. 주소 및 메서드를 포함하는 MethodTheUserCanCall 컬렉션이있는 경우 일반적인 방법으로 IService1의 SomeMethod 메서드가 Address/메서드 만 포함하는 MethodTheUserCanCall 인스턴스로 표시된다는 것을 어떻게 알 수 있습니까? –

1

내가 취한 접근법은 서비스 뒤에있는 메서드를 보호하기 위해 ClaimSet 검사를 수행하는 클래스입니다. 속성을 사용하여 유형, 자원 및 올바른 속성 값으로 메소드를 꾸미십시오. 그런 다음 검사 클래스에는 호출자의 ClaimSet에 이러한 속성 값이 포함 된 클레임이 포함되지 않은 경우 예외를 throw하는 Demand 메소드가 있습니다. 따라서 어떤 메소드 코드가 실행되기 전에 클레임 검사 요구가 먼저 호출됩니다. 요청 후에 메소드가 여전히 실행중인 경우에는 호출자가 좋습니다. 검사 클래스에는 예외를 던지지 않고 같은 질문에 대답하는 bool 함수가 있습니다 (호출자에게 적절한 클레임이 있음).

클라이언트와 함께 배포되도록 검사 클래스를 패키지화하고 클라이언트가 호출자의 ClaimSet (서비스의 GetClaimSet 메서드를 통해 제공함)을 가져올 수있는 한 검사 클래스를 만들어야합니다. 도메인 모델이 수행하는 것과 동일한 평가입니다. 그런 다음 내보기 모델에서 ICommand 속성의 CanExecute 메서드에있는 claim 검사 클래스의 bool 메서드를 사용하여 컨트롤을 사용하거나 사용하지 않도록 설정하고 기본적으로 사용자가 클레임이없는 작업을 수행하지 않도록 허용 예외를 가져 오지 못하게합니다 에 대한.

클라이언트가 어떤 방법에 대해 어떤 클레임이 필요한지를 아는 한, 클라이언트 개발자에게이를 알리는 것으로 남겨 두었습니다. 일반적으로 내 프로젝트에서이 방법은 매우 고전적인 방식으로 진행 되었기 때문에 큰 문제는 아닙니다. 따라서 애플이 애플을 추가하는 것이라면 직관적으로 Type = Apple, Right = Add가 될 것이다.

이 방법이 상황에 도움이되는지 확신하지 못했지만 일부 프로젝트에서 꽤 잘 작동했습니다.

+0

안녕하세요. 의견을 보내 주셔서 감사합니다. 그게 내가 사용할 수있는 접근법 같아. –

관련 문제