2010-06-14 6 views
1

현재 상황은 : 우리는있는 wsHttpBinding 또는 netTcpBinding를 통해 조직 전체의 여러 응용 프로그램에서 사용 3.5 WCF 서비스, .NET 생산이 . 사용자 인증은 Windows 통합 보안을 사용하여 전송 수준에서 수행됩니다. 이 서비스는 Foo(string parameter) 메서드를 가지고 있으며, 해당 AD 그룹의 멤버 만 호출 할 수 있습니다. 문자열 매개 변수는 필수입니다. WCF 서비스 메서드의 호출 어셈블리를 안전하게 인증하려면 어떻게합니까? 다음과 같이

새로운 클라이언트 응용 프로그램

문자열 매개 변수의 필요성을 제거 플레이 (.NET 3.5, C# 콘솔 응용 프로그램)에왔다. 그러나이 특정 응용 프로그램의 호출 만 문자열 매개 변수를 생략 할 수 있어야합니다. AD 그룹 제한이 여전히 적용되기 때문에 클라이언트 응용 프로그램 호출자의 ID는 서버에서 계속 인식해야합니다 (클라이언트 측에서 가장을 배제 함).

나는 pass on the "evidence" of the calling (strong-named) assembly in the message headers 할 수있는 방법을 찾았지만 "증거"가 쉽게 스푸핑 할 수 있기 때문에이 방법은 분명 안전하지 않습니다. 또한 CAS (코드 액세스 보안)가 가능한 해결책 인 것처럼 보이지만이 특정 시나리오에서 CAS를 사용하는 방법을 파악할 수 없습니다.

사람이 문제를 해결하는 방법에 대한 제안이 있습니까?

편집 : 나는 another thread on this subject 발견; 분명히 안전한 방식으로 구현하는 것은 단순히 불가능하다는 결론을 내 렸습니다.

+0

또한 클라이언트 응용 프로그램의 디 컴파일 코드가 해커를 제공 할 것을 언급해야한다 인증 절차를 모방하는 정보 – Tim

답변

0

다른 서비스로 보안을 끌어 와야 할 것 같은 소리가납니다 ... 더 안전한 경로 토큰을 생성하기 위해 공개 키와 개인 키를 사용하여 악의적 인 형태의 암호화를 구현할 수있는 이쪽의 페더 레이팅 경로로 이동하십시오. 두 상황.

당신이 윈도우 A = uthentication 및 보안 방법에 속성을 유지하는 동안 플레이에서 사용자 지정 솔루션을 모두 얻을 여전히 CNA의이 방법 (난 당신이 이런 식으로 구현된다고 가정하고 있습니다.)

공정한 같은 소리 그래도 처음부터이 작업을 수행하고 크로스 도메인/위임 문제가 발생했습니다. 그러나 나는 그 아이디어가 훌륭하다고 확신합니다.

당신은 좋은 고체 클레임 기반 보안] 모델 종료됩니다 howver

+0

커스텀 핸드 셰이크 프로토콜에 대한 아이디어가 내 마음을 넘어 섰다고 말해야 만합니다. (아주 자세히는 아니지만 :-)), 너무 많은 작업과 더 많은 이슈를 줄 것이라고 생각했기 때문에 그것을 버렸습니다. 귀하의 답변에 의해 확인 된 바와 같이. 그러나 이것이 유일한 방법 인 경우. 나는 그것을 위해 가야만 할 것 같아. WCF 서비스의 컨텍스트에서 이러한 종류의 클레임 기반 보안 모델을 설명하는 페이지를 알고 있습니까? 세션이 내 클라이언트 응용 프로그램을 안전하게 인증하는지 확실하지 않습니다. – Tim

+0

이 아이디어로 잠을 자고 나면 별도의 서비스가 초기 서비스와 동일한 문제에 직면 할 것이라고 생각하지 않을 수 있습니다.이 서비스도 보안 세션 키를 제공하기 위해 호출 어셈블리를 안전하게 인증해야합니다. 이 가정이 맞습니까? 아니면 뭔가 빠졌습니까? – Tim

+0

나는 휴가를 갔다. 음, 내 가정은 데이터를 통해 어셈블리에 대한 신뢰가 없다는 것입니다. 비동기 암호화를 사용하면 키를 회전시켜 키의 약점을 만들 수 있습니다.서버 쪽에서 키를 회전하면 클라이언트가 100 % 안전하지는 않지만 공격자가 충분한 시간을 투자 할 수 없도록 만들 수 있습니다. 따라서 신뢰할 수있는 핸드 쉐이킹을 사용하면 자신감을 가질 수있는 유일한 방법입니다. 클라이언트와 초기 의사 소통에서 사용되는 키에 약점이 있기 때문에 완벽하지는 않습니다. 그러나 자신감 부족은 당신의 정의에 의한 것입니다. –

0

당신은 발신자 주소 얻을 수 있습니다 :

RemoteEndpointMessageProperty clientAddress = 
    OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] 
as RemoteEndpointMessageProperty; 
      string address = clientAddress.Address; 
+0

흥미로운 사실이지만 클라이언트 응용 프로그램은 많은 수의 컴퓨터에서 실행해야합니다. 고객 주소는 감사에서 언급 할 때 분명 유용 할 것입니다. – Tim

관련 문제