스트리밍을 지원하는 Basichttpbinding을 사용하여 WCF 서비스 확보

StackOverflow https://stackoverflow.com/questions/845423

  •  21-08-2019
  •  | 
  •  

문제

제 질문은 회사의 내부 사용자에게만 노출 된 WCF 서비스에 대한 액세스를 확보하는 최고의 (일명 "최소 고통스러운") 방법과 관련하여입니다. 목표는 각 사용자가 설치 한 단일 Windows Forms 응용 프로그램을 통해서만 서비스에 액세스하는 것입니다. 서비스가 호출되면 서비스가 허용 된 응용 프로그램에서 호출되었는지 확인할 수 있기를 원합니다.

보안 서비스는 스트리밍을 지원하는 Basichttpbinding을 사용하므로 전송 수준 보안으로 제한되어 있다고 생각합니다.

아래는 단순화 된 버전입니다 <bindings> 그리고 <services> 내 서비스의 구성 파일의 섹션.

<bindings>
  <basicHttpBinding>
    <binding name="Service1Binding" transferMode="Streamed"/>    
  </basicHttpBinding>
</bindings>

<services>
    <service name="WCFServiceSecurity.Service1" 
        behaviorConfiguration="WCFServiceSecurity.Service1Behavior">
        <endpoint address=""
            binding="basicHttpBinding"
            contract="WCFServiceSecurity.IService1"
            bindingConfiguration="Service1Binding"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
</services>

이 서비스에서 보안을 구현하기 위해 어떤 조치를 취해야하는지에 대한 세부 정보를 제공 할 수 있습니까?

참고 : 저는 WCF를 처음 사용하고 보안에 전혀 익숙하지 않으므로 세부 사항을 충분히 제공하지 않았는지 알려주십시오.


업데이트:

처럼 marc_s가 제안합니다, 일종의 사용자 이름/비밀번호 메커니즘을 사용하여 WCF 서비스를 보호하고 싶습니다. 이것은 답을 향해 조금 더 방향을 제시하지만 여전히 다소 흐릿합니다. 어떻게 실제로이 작업을 수행합니다.

내 서비스는 스트리밍이 활성화되어야하므로 Basichttpbinding 및 운송 수준 보안을 사용해야합니다 (오른쪽?). 또한 내 서비스에 포함 된 방법은 스트림 객체 만 허용 할 수 있습니다.

사용자 이름/비밀번호 유효성 검사를 사용하는 선호도와 함께 이러한 제약 조건을 고려합니다 ...

  • 사용자 이름/비밀번호 자격 증명을 강제로 제공하기 위해 서비스의 구성 파일을 어떻게 수정해야합니까?
  • 내 서비스는 제공된 자격 증명을 어떻게 검증합니까?
  • 클라이언트 응용 프로그램은 전화를 걸 때 자격을 어떻게 전달합니까?
  • 이를 위해서는 SSL을 사용해야하며 그렇다면 모든 클라이언트 시스템에 인증서도 필요합니까?

업데이트:

이 서비스를 상사에게 확보하는 데 어려움을 겪은 문제를 설명한 후 Windows 인증 경로를 시도해 볼 수있는 사람이 주어졌습니다. 슬프게도, 나는 스트리밍 된 서비스 (ARGH)로 이러한 유형의 인증을 구현하는 데 운이 없었습니다. 적절한 변경 후 (설명 된대로 여기 - 유일한 예외는 내 것입니다 transferMode="Streamed") 그리고 내 서비스에 액세스하면 다음과 같은 오류가 제시되었습니다.

HTTP 요청 스트리밍은 HTTP 인증과 함께 사용할 수 없습니다. 요청 스트리밍을 비활성화하거나 익명의 HTTP 인증을 지정하십시오.

그런 다음 다음 인용문을 우연히 발견했습니다 여기 설명을 제공합니다.

당신은 운송 인증을 할 수 없습니다. 스트리밍으로. HTTP 요청 스트리밍을 사용해야하는 경우 보안없이 실행해야합니다.

보안이 작동하는 방식은 다음과 같습니다.

WCF 클라이언트는 서버에 HTTP 요청을합니다.

서버는 "당신은 승인받지 않고 기본/다이제스트/etc 자격 증명을 보내십시오."라는 말로 응답합니다.

클라이언트는 해당 응답을 받고 자격 증명을 사용하여 메시지를 재현합니다.

이제 서버는 메시지를 받고 자격 증명을 확인하고 계속합니다. 요청 스트리밍은 해당 보안 패턴으로 작동하도록 설계되지 않았습니다. 그렇다면 클라이언트가 전체 스트림을 보내고 서버에서 승인되지 않은 메시지를 받기 때문에 실제로 느리게 진행되므로 자격 증명으로 전체 스트림을 재현해야합니다.

이제 나는 의견을 찾고 있습니다. 스트리밍 지원 WCF 서비스를 어떻게 보호 하시겠습니까? 앞에서 언급했듯이 어떤 종류의 사용자 이름/암호 메커니즘이 선호됩니다. 이 상자 밖에서 자유롭게 생각해보십시오 ...

모든 도움이 있습니다 매우 감사합니다!

도움이 되었습니까?

해결책

글쎄, 나는이 문제를 해결하는 동안 보안/스트리밍과 관련된 많은 문제를 발견했습니다. 마침내 해킹 (er ... um ... workaround)은 결국 메모리 스트림을 상속하는 새로운 데이터 콘텐츠를 만드는 것이었고 (스트리밍을 원하는 데이터를 보유하는 데 사용)는 사용 된 적절한 속성과 함께베이스 스트림 속성으로 장식했습니다. 간단한 인증.

결과 데이터 콘텐츠는 다음과 같습니다.

[DataContract]
[KnownType( typeof( MemoryStream ) )] 
public class StreamWithCredentials : MemoryStream
{
    [DataMember]
    public Stream BaseStream { get; set; }

    [DataMember]
    public string Username { get; set; }

    [DataMember]
    public string Password { get; set; }
}

위의 데이터 콘텐츠는 내 서비스 메소드의 입력 매개 변수가됩니다. 내 서비스가 취하는 첫 번째 조치는 알려진 유효한 값에 대한 제공된 자격 증명을 인증하고 적절하게 계속하는 것입니다.

이제 나는한다 알다 이게 ~ 아니다 가장 안전한 옵션이지만 내 지시 사항은 SSL 사용을 피하는 것이 었습니다.어쨌든 할 수 없는지 확실하지 않습니다 - 언급했듯이 여기)이 내부 프로세스를 위해.

즉, 이것은 내가 생각해 낼 수있는 위에서 언급 한 문제에 대한 최선의 해결책이었습니다. 이것이 다른 사람 이이 문제를 겪는 데 도움이되기를 바랍니다.

응답 한 모든 분들께 감사드립니다.

다른 팁

할 수있는 일이 여러 가지가 있습니다.

  • 서비스를 사용할 수있는 각 컴퓨터에 인증서를 추가하고 해당 인증서를 확인하십시오. 이를 통해 "무단"기계를 제외 할 수 있습니다. 특정 응용 프로그램으로 제한 할 수 없습니다.
  • 위와 동일하지만 Winforms 앱에 포함 된 인증서를 포함하여 거기에서 보내십시오 (기계의 인증서 저장소에 저장하지 마십시오).
  • 귀하의 특정 앱만이 알고 있고 서비스를 전송할 수있는 사용자 이름 / 비밀번호가 필요합니다. 예 : 다른 사람이 적절한 자격 증명을 제시 할 수 없습니다.

편집 2 : 좋아, 따라서 사용자 이름/비밀번호 접근 방식이 손을 떼는 것처럼 보인다 .... 기본 보호를위한 기본 전송 보안 (SSL)이 있다면 MessageContract 비누 메시지의 헤더 및 본문을 정의하려면 헤더에 특정 값을 포함시킨 다음 서비스의 헤더에있는 요소의 존재를 확인하십시오.

그런 것 :

[DataContract]
class YourRequestData
{
 ...
}

[MessageContract]
public class YourRequest
{
  [MessageBodyMember]
  public YourRequestData bodyData { get; set; }

  [MessageHeader]
  public string AppThumbprint { get; set; }
}

그리고 코드의 서버에서 그 존재와 유효성을 확인하십시오. AppThumbprint 암호:

public Stream RequestStream(YourRequest request)
{
  if(AppThumbprintIsValid(request.AppThumbprint))
  {
     .... begin your streaming
  }
}

이는 사용자 이름/비밀번호 보안 시나리오보다 훨씬 쉬울 수 있습니다.

마크

내가 틀렸다면 저를 바로 잡으십시오.

WCF 서비스 (ASP.NET)에 양식 인증을 사용하는 경우 서비스에 로그인 메소드를 추가하면 필요한 쿠키를 만듭니다 (FormsAuthentication.authenticate ()). 응답으로 자동으로 전송되면 클라이언트는 추가 매개 변수가 필요하지 않고 스트림 API를 호출 할 수 있으며 (스트림이어야하는 요구 사항), 리턴 스트림에서 발사하기 전에 스트리밍 API의 ID를 확인할 수 있습니다.

전체 WCF에 대한 액세스를 확보하는 데있어 .NET 앱에 인증서를 포함시키는 것이 한 가지 방법입니다. 그들은 당신의 앱을 얻기 위해 ildump해야 할 것입니다.

wsdl을 자동으로 생성하지 않도록 wsdl을 제공하지 말라고 ASP.NET/WCF에게 알릴 수 있습니다. WSDL 액세스가 없으면 프록시를 생성하기가 훨씬 어려워집니다 ....

사용하려면 basicHttpBinding (Interop의 경우) 메시지 수준에서만 자격 증명을 전달할 수 있습니다. 보안 구성을 설정해야합니다 TransportWithMessageCredential.

이를 위해서는 SSL 채널을 만들어야하므로 서버 측에 인증서가 필요하며 클라이언트가 있어야합니다.

스트리밍 및 SSL과 함께 Windows 인증을 사용할 수 있지만 사용해야합니다. TransportWithMessageCredential:

<basicHttpBinding>
    <binding name="FileService.FileServiceBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed">
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="Windows" />
        </security>
    </binding>
</basicHttpBinding>

코드로 설정해야합니다 proxy.ClientCredentials.UserName.UserName 그리고 proxy.ClientCredentials.UserName.Password.

이것이 인트라넷에 사는 응용 프로그램이 되려면 Active Directory에서 새 그룹을 만들고 해당 그룹의 구성원에게 서비스를 사용할 수있는 능력 만 제공하는 것이 가장 쉬울 수 있습니다.

다음과 같은 내용으로 인증 (Windows 자격 증명 사용)을 추가 할 수 있습니다.

<basicHttpBinding> 
 <security mode="TransportCredentialOnly"> 
  <transport clientCredentialType="Windows" /> 
 </security> 
</basicHttpBinding> 

그런 다음 서비스 방법에 대한 인터페이스를 장식하여 승인 할 수 있습니다.

<PrincipalPermission(SecurityAction.Demand, Role:="MyAppsUsers")> _ 
Public Function MyMethod() As String Implements IService.MyMethod 

그녀는 WCF의 보안에 대한 좋은 링크입니다. 마지막에 방법이 많이 있습니다 ( 'Windows 인증 및 TransportCredals와 함께 Basichttpbinding을 사용하는 방법'이라는 제목의 제목은 귀하에게 사용될 수 있습니다).
WCF 비밀

면책 조항 : 나는 또한 WCF를 처음 접 했고이 정확한 사례를 수행하지 않았으므로 이것이 약간 꺼져 있는지 사과합니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top