이 구성 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도이 시나리오를 처리해야한다고 생각합니다.
클라이언트 asp.net, 모바일 또는 데스크톱 응용 프로그램이 있습니까? 인트라넷 또는 인터넷 시나리오입니까? 인트라넷의 경우 Windows 도메인을 사용할 수 있습니까? –
@ 라디 슬라브 - 고마워요. 내 질문에 추가 정보를 추가했습니다. 나는 이것을 원래 추가해야했다. – Hosea146
ASP.NET 및 WCF 서비스가 사용자 환경에서 호스팅됩니까 (ASP.NET과 WCF 사이의 연결이 로컬이기 때문에)? 서비스 사용자의 정보가 필요합니까 (예 : 다른 사용자가 다른 데이터를 받음) 또는 액세스를 제한하기 만하면됩니까? –