2013-03-09 2 views
3

내 웹 사이트는 AD FS 기반 인증을 구현합니다. 이제 프로그래밍 방식으로 클라이언트를 통해 내 웹 사이트에 액세스해야합니다. 내 클라이언트는 현재 로그온 한 사용자의 컨텍스트를 사용하여 ADFS 서버에 보안 토큰을 요청해야합니다. 클라이언트의 사용자 이름과 암호를 사용하여 adfs/services/trust/13/usernamemixed 끝점에서 보안 토큰을 요청하고이를 내 웹 사이트에 게시 할 수있었습니다.STS의 RequestSecurityToken을 내 웹 사이트에 게시하십시오.

나를 위해 작동하지 않는 것은 DefaultNetworkCredentials을 사용하여 adfs/services/trust/13/windowsmixed 엔드 포인트에서 동일한 토큰을 요청하는 것입니다. The HTTP request was forbidden with client authentication scheme 'Anonymous'. 오류가 나타납니다. .NET Framework에서 System.IdentityModel 대신 Microsoft.IdentityModel SDK를 사용하고 있습니다.

다음은 내 코드 스 니펫입니다.

factory = new MSWSTrustChannelFactory(
    new Microsoft.IdentityModel.Protocols.WSTrust.Bindings.WindowsWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
        stsUrl); 

    factory.TrustVersion = TrustVersion.WSTrust13; 

    factory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials; 

    var rst = new RequestSecurityToken 
    { 
     RequestType = RequestTypes.Issue, 
     AppliesTo = new EndpointAddress(realm), 
     KeyType = KeyTypes.Bearer, 
     RequestDisplayToken = true 
    }; 

    MSIWSTrustChannelContract channel = factory.CreateChannel(); 
    RequestSecurityTokenResponse rstr; 
    SecurityToken token = channel.Issue(rst, out rstr); 

저는 ADFS 서버에 대한 제어 권한이 없으므로 여기에서 잘못된 내용을 디버깅 할 수 없습니다. 내가 할 수있는 것은 클라이언트 쪽에서 온 것입니다. 위의 코드에서 어떤 문제가 발생하는지 알고 싶습니다. 어떤 도움이나 조언을 주시면 감사하겠습니다.

답변

1

메시지 보안의 establishSecurityContext를 FALSE로 설정해야한다고 생각합니다.
binding.Security.Message.EstablishSecurityContext = false;

다음 코드는 저에게 적합합니다.

  WS2007HttpBinding binding = new WS2007HttpBinding(SecurityMode.TransportWithMessageCredential); 
      binding.Security.Message.EstablishSecurityContext = false;    
      binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; 
      if (isWindowsUser) 
      { 
       binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 
       ep = new EndpointAddress("https://abc.com/adfs/services/trust/13/windowsmixed");      
      } 
      else 
      { 
       binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; 
       ep = new EndpointAddress("https://abc.com/adfs/services/trust/13/usernamemixed");      
      } 
      factory = new WSTrustChannelFactory(binding, ep); 
      factory.TrustVersion = TrustVersion.WSTrust13; 

       factory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;      


      var rst = new RequestSecurityToken 
      { 
       RequestType = RequestTypes.Issue, 
       AppliesTo = new EndpointReference("urn:adfsmonitor"), 
       KeyType = KeyTypes.Bearer, 
      }; 
      IWSTrustChannelContract channel = factory.CreateChannel(); 
      GenericXmlSecurityToken genericToken = channel.Issue(rst) 
      as GenericXmlSecurityToken; 
      return genericToken.TokenXml.InnerXml.ToString();