RequestSecurityToken от STS и опубликовать его на моем сайте

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

То, что не работает для меня, запрашивает тот же токен из 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 ответ

Я думаю, что вам нужно установить установить SecurityContext безопасности сообщения как ЛОЖЬ
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();
Другие вопросы по тегам