2012-01-21 3 views
1

우리는 WCF를 통해 C# 백엔드 서비스와 통신하는 C# 클라이언트 응용 프로그램을 보유하고 있습니다. 우리는 WCF 서비스를 호출하는 방법을 알아 낸 일부 해커가 아닌, 클라이언트에 로그인 한 사용자가 보낸 각 WCF 호출을 확인하려고합니다.간단한 WCF 보안 구현 방법

나는 이것을 보장 할 수있는 몇 가지 방법이 있다고 가정합니다. 그 중 하나는 백엔드 로그인 메소드가 각 클라이언트 WCF 호출이 WCF 호출의 일부로 전달해야하는 일종의 토큰을 반환하도록하는 것입니다. 이러한 토큰을 얻으려면 호출자가 유효한 로그인 자격 증명을 제공해야합니다. 그러면 각 WCF 호출에 대해 토큰이 뒷면에서 유효성이 검사됩니다. 토큰을 확인할 수 없으면 WCF 호출이 실패합니다.

나는이 작업을 간단하게 수행하고 싶습니다. 우리는 초고속 복합체를 필요로하지 않습니다. 누구든지이 작업을 수행하는 표준 방법에 대한 정보가 있습니까? 우리는 .NET 4를 사용하고 있습니다. WCF에 대한 많은 경험이 없다고 덧붙여 야합니다.

조금 더 자세한 정보. WCF 서비스를 호출하는 두 가지 클라이언트 응용 프로그램이 있습니다. 하나는 WPF 기반 클라이언트이고 다른 하나는 브라우저 기반 응용 프로그램 (ASP.NET)입니다. 둘 다 인터넷 전반에 적용됩니다. 우리의 고객은 세계 어느 곳에 나있을 수 있습니다.

+0

클라이언트 asp.net, 모바일 또는 데스크톱 응용 프로그램이 있습니까? 인트라넷 또는 인터넷 시나리오입니까? 인트라넷의 경우 Windows 도메인을 사용할 수 있습니까? –

+0

@ 라디 슬라브 - 고마워요. 내 질문에 추가 정보를 추가했습니다. 나는 이것을 원래 추가해야했다. – Hosea146

+0

ASP.NET 및 WCF 서비스가 사용자 환경에서 호스팅됩니까 (ASP.NET과 WCF 사이의 연결이 로컬이기 때문에)? 서비스 사용자의 정보가 필요합니까 (예 : 다른 사용자가 다른 데이터를 받음) 또는 액세스를 제한하기 만하면됩니까? –

답변

1

이 구성 wsHttpBinding을 사용하고이를 구현하는 가장 쉬운 방법 :

<bindings> 
    <wsHtttpBinding> 
    <binding name="securitySession"> 
     <security mode="Message"> 
     <message clientCredentialType="UserName" 
       establishSecurityContext="true" 
       negotiateServiceCredentials="false" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</binding> 

이 바인딩은 보안 세션으로 상태 전체 서비스를 구성합니다. 클라이언트가 서비스의 프록시를 작성하는 경우, 내부적으로 수행되는 초기 보안 핸드 셰이크에서 사용자 이름과 암호를 전달해야합니다. 이 핸드 셰이크 동안 WCF는 보안 토큰과 연결된 서비스 인스턴스를 만듭니다. 보안 토큰은 클라이언트 프록시에 다시 전달되고 프록시는 내부적으로이를 저장합니다. 동일한 프록시 인스턴스로부터의 이후의 모든 호출은이를 인증하고 올바른 서비스 인스턴스와 쌍을 이루는이 토큰을 포함합니다.

사용자 환경에서이 구성이 작동하도록하려면 통신을 보호 할 인증서를 사용하도록 서비스를 구성해야합니다. 그렇지 않으면 누구나 통신 및 스틸 사용자 이름과 암호 또는 토큰을 가로 챌 수 있습니다. 또한 서비스 측면에서 사용자 지정 사용자 이름과 암호 유효성 검사기 (또는 ASP.NET 멤버십)를 사용해야합니다.

어떻게 솔루션에 맞습니까?

ASP.NET 응용 프로그램은 보안 세션을 시작하는 서비스를 사용하여 사용자 지정 폼 인증을 사용할 수 있습니다. ASP.NET 쪽에서는 ASP.NET 세션에서 프록시를 유지해야하며 보안 및 ASP.NET 세션에 대한 시간 제한은 ASP.NET 세션이 WCF 보안 세션 전에 만료되도록 올바르게 구성되어야합니다. 쿠키를 사용하여 후속 클라이언트 호출에 대해 올바른 ASP.NET 세션을 수신합니다.

WPF 응용 프로그램에서 응용 프로그램 실행 당 동일한 접근 방식과 저장소 프록시를 사용할 수 있습니다. 프록시가 시간 제한을 초과하거나 시간 제한을 처리하지 못하도록하고 사용자에게 다시 로그인해야합니다. 클라이언트 컴퓨터는 서비스에서 사용하는 인증서도 신뢰해야합니다.

WPF의 경우 보안 세션을 피하고 establishSecurityContext="false"으로 서비스의 두 번째 끝점을 노출 할 수도 있습니다.이 경우 사용자 이름과 암호는 WPF 응용 프로그램의 모든 호출에 포함되므로 상태가 만료 된 서비스를 사용하는 긴 생존 프록시와 관련된 많은 문제를 해결할 필요가 없습니다. WPF 응용 프로그램의 보안 컨텍스트 서비스가 없으면 상태가 줄어 듭니다. ASP.NET에서이 기능을 사용하지 않으려는 이유는 세션에 사용자 이름과 암호를 저장해야하기 때문입니다.

이 솔루션의 단점은 무엇입니까?

이것은 중량이 큰 솔루션입니다. 보안 컨텍스트는 사용자 측에서 코딩하지 않고 찾고있는 기능을 제공하지만 자체 비용이 있습니다. ASP.NET 응용 프로그램에서 세션을 사용해야 WCF 프록시를 유지 관리 할 수 ​​있습니다. 일반적으로 피해야하는 상태의 전체 서비스가 제공되므로 응용 프로그램에 과중한 부하가 발생할 것으로 예상되는 경우 많은 성능과 메모리 조정이 필요합니다 . 세션이 올바르게 릴리스되고 모든 WCF 프록시가 올바르게 닫히고 처리되어 서비스 인스턴스가 해제되도록 제어해야합니다. 동시 실행중인 서비스 인스턴스를 충분히 지원하려면 WCF에서 조절해야합니다.

4 년 전에 많은 양의 인터넷을 사용하는 웹 응용 프로그램에서 유사한 접근 방식을 성공적으로 사용했지만 모든 문제를 찾아 모든 시간 제한을 올바르게 구성하고 모든 개체를 올바르게 처리하는 데 시간이 걸렸습니다.

대신 하나의 추가 서비스에서 인증을 처리하고 ASP.NET 응용 프로그램과 WCF 서비스에 인증하는 데 사용되는 보안 토큰을 제공하는 페더레이션 시나리오를 찾을 수 있습니다. OAuth도이 시나리오를 처리해야한다고 생각합니다.

0

인증서 기반 메시지 보안을 사용하여 wsHttpBinding을 사용하는 것이 좋습니다. 여기에 연습을 살펴보십시오 : http://www.codeproject.com/Articles/28248/Securing-WCF-Services-with-Certificates (이것은 윈도우 서버 2003하지만 절차는 새로운 서버에서 크게 다르지 않다)

+0

그리고 당신은 그들의 인증서 주체에 의해 이들 클라이언트를 식별 할 수 있습니다. 'OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name'은 사용자 정보를 보유 할 것입니다 –