2013-03-09 9 views
3

Мой веб-сайт реализует аутентификацию на основе AD FS. Теперь мне нужно программно получить доступ к моему веб-сайту через клиента. Мой клиент должен запросить маркер безопасности с сервера ADFS, используя текущий пользовательский контекст. Я успешно смог запросить маркер безопасности с конечной точки adfs/services/trust/13/usernamemixed, используя имя пользователя и пароль от клиента и разместил его на моем веб-сайте.RequestSecurityToken от STS и опубликовать его на моем сайте

То, что не работает для меня, запрашивает один и тот же токен с конечной точки adfs/services/trust/13/windowsmixed, используя DefaultNetworkCredentials. Я получаю ошибку The HTTP request was forbidden with client authentication scheme 'Anonymous'.. Я использую Microsoft.IdentityModel SDK (вместо System.IdentityModel в .NET 4.5).

Вот фрагмент моего кода.

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

Я думаю, вам нужно установить installSecurityContext безопасности сообщений как 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();