2013-05-30 6 views
2

우리는 HTTP를 통해 콘텐츠를 호스팅하는 자체 호스팅 WCF 서비스를 가지고 있으며 Windows/AD를 통한 단일 로그온을 지원할 수 있기를 원합니다. IE, Firefox 및 Chrome을 지원하는 것이 이상적입니다.SSO가 포함 된 자체 호스팅 WCF 서버

HTTP를 통해 일반 텍스트를 반환하는 다음 샘플 서비스를 빌드했습니다. 참고 :이 프로덕션 버전에서는 SSL을 사용하지만 샘플을 덜 까다롭게 만들기 위해 아래에서 설명했습니다.

우리는 HttpSecurityMode를 TransportCredentialOnly로 설정하고 ClientCredentialType을 HttpClientCredentialType.Windows로 설정합니다.이 설정은 Kerberos를 사용합니다.

"Windows"대신 "NTLM"을 사용하면 작동하는 것처럼 보이지만 NTLM을 사용하여 NTLM을 사용한다는 사실을 모았습니다. 역방향 프록시가 우리 서비스 앞에 있으면이 서비스가 중단됩니다.

다음 코드를 실행하고 IE 10에 연결할 때 Windows 자격 증명을 묻는 메시지가 표시되지만 입력 한 후에는 HTTP 400을 얻고 "Get"메서드 내에서 중단 점을 누르지 않습니다. 이상적으로 우리가 볼 수있는 것은 "Hello, [Domain \ User]!"라는 응답입니다. 그러나 우리는 그렇게까지 그렇게하지 않습니다.

테스트 시스템 (클라이언트 및 서버)은 모두 동일한 Windows 도메인에 속합니다. 로컬 관리자로 서비스를 실행 중이지만 도메인 관리자가 아닙니다 (문제가있는 경우).

우리는 어떤 도움을 주셔서 감사합니다!

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.ServiceModel; 
using System.ServiceModel.Description; 
using System.ServiceModel.Web; 
using System.Text; 

namespace WindowsAuthService 
{ 
    [ServiceContract] 
    public interface ITestService 
    { 
     [OperationContract] 
     [WebGet(UriTemplate = "{*path}")] 
     Stream Get(string path); 
    } 


    public class TestService : ITestService 
    { 
     public Stream Get(string path) 
     { 
      WebOperationContext.Current.OutgoingResponse.Headers.Add(HttpResponseHeader.ContentType, "text/plain"); 
      if (OperationContext.Current.ServiceSecurityContext == null) 
       return new MemoryStream(Encoding.ASCII.GetBytes(String.Format("Hello, {0}!", "Anonymous Stranger"))); 
      else 
       return new MemoryStream(Encoding.ASCII.GetBytes(String.Format("Hello, {0}!", OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name))); 
     } 
    } 

    class Program 
    { 
     private const string URL = "http://mymachine.mydomain:7777"; 
     static void Main(string[] args) 
     { 
      WebServiceHost serviceHost = new WebServiceHost(new TestService()); 
      foreach (IServiceBehavior attr in serviceHost.Description.Behaviors) 
      { 
       if (attr is ServiceBehaviorAttribute) 
       { 
        ServiceBehaviorAttribute serviceAttr = (ServiceBehaviorAttribute)attr; 
        serviceAttr.InstanceContextMode = InstanceContextMode.Single; 
        serviceAttr.ConcurrencyMode = ConcurrencyMode.Multiple; 
       } 
      } 
      WebHttpBinding binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly); 
      binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 
      ServiceEndpoint serviceEndpoint = serviceHost.AddServiceEndpoint(typeof (ITestService), binding, URL); 
      serviceEndpoint.Behaviors.Add(new WebHttpBehavior()); 
      Console.WriteLine("Service Listening @ " + URL); 
      serviceHost.Open(); 
      Console.WriteLine("[ Press Enter to Quit ]"); 
      Console.ReadLine(); 
     } 
    } 
} 

답변

1

작업 코드가 있습니다. 네가 프록시를 가지고있는 것 같아. 그렇다면 IE 10에서 도구> 인터넷 옵션> 연결 (탭)> LAN 설정으로 이동하십시오. 대화 상자에서 로컬 주소에 프록시 서버 사용 안함을 선택하십시오.

또한 보안 탭> 로컬 인트라넷> 사이트 버튼을 클릭하고 로컬 인트라넷 자동 감지 - 자격 증명을 묻지 않습니다. - IE 10은 로그인 한 사용자의 자격 증명을 보냅니다.

+0

프록시 설정이 없습니다. "자동으로 로컬 인트라넷 검색"을 조정하여 내 서버를 포함시키고 수정했습니다. Firefox 또는 Chrome에서이 작업이 발생할 가능성이 있는지 알고 계십니까? –

+0

예, Windows에서 작동해야합니다. Chrome에서 작동합니다. 그러나 다른 비 Windows 운영 체제에서는 힘든 일입니다. – YK1

+0

나는 너무 일찍 말했다. HttpClientCredentialType.Windows는 내 컴퓨터에서만 작동합니다. 다른 컴퓨터를 사용하자마자 전혀 작동하지 않습니다. 그러나 서버를 "로컬 인트라넷"에 추가하면 Internet Explorer와 Chrome에서 메시지를 표시하지 않고도 NTLM 인증이 원활하게 작동합니다. 불행히도 NTLM의 프록시없는 제한은 여전히 ​​문제입니다. 나는 분명히 HttpClientCredentialType.Windows와 함께 뭔가를 놓치고있어 ... –

관련 문제