На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> настройка wss в wcf
    всем привет.
    не подскажите как настроить wss в wsHttpBinding, такие как user, password, password type.
    Спасибо.
      Не представляю что в твоем случае означает password type, но вот пример стандартного сценария:
      How To - Use Username Authentication with the SQL Membership Provider and Message Security in WCF
        Если я правильно понял, то тебе надо реализовать в сервисе WCF oasis-200401-wss-username-token-profile-1.0.pdf?

        Если да, то в запасниках у меня нашлась только такая ссылка.

        В общем там надо сделать наследника от MessageHeader, который будет добавлять нужный заголовок в XML. А потом через OperationContextScope и OperationContext добавлять его.
          Felan
          ага. типа того. грубо говоря мне нужно заслать нечто подобное:
          ExpandedWrap disabled
            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.is.shit.com">
            <soapenv:Header>
                <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                    <wsse:UsernameToken wsu:Id="UsernameToken-7" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
                        <wsse:Username>XXX</wsse:Username>
                        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">XXX</wsse:Password>
                        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">aIFkEUMZyhKuzGobh3CRpg==</wsse:Nonce>
                        <wsu:Created>2011-09-20T09:33:11.545Z</wsu:Created>
                    </wsse:UsernameToken>
                </wsse:Security>
            </soapenv:Header>
            <soapenv:Body>
                  <body/>
            </soapenv:Body>
            </soapenv:Envelope>


          Так как сервис написан кажется на Java - студия не генерирует строготипизированный контракт. Вместо этого - если я прав - нужно юзать Message и иже с ним. И что то я тут ни разу не преуспел :crazy:
          Любопытно - что если формировать посылку руками и слать через HttpWebRequest - все получается и ответ не заставляет себя ждать. Но хочется заюзать WCF. Пока топчусь на месте.


          Felan спасибо за наводку. Попробую.

          Добавлено
          Цитата spicard @
          Не представляю что в твоем случае означает password type, но вот пример стандартного сценария:

          это настройка через soapUi. как я понимаю это фича wss. Это кстати отражается в запросе к сервису приведенному мною выше.
            Цитата mrbrooks @
            Так как сервис написан кажется на Java - студия не генерирует строготипизированный контракт.

            Это не важно, что на Java. Студия его и не будет генерить, потому как это относится к устаревшей технологии. WCF ее не поддерживает. Поэтому надо в ручную добавлять заголовки.

            Вот файл заголовка:

            ExpandedWrap disabled
              using System;
              using System.ServiceModel.Channels;
              using System.Xml;
               
              namespace NMS
              {
                  class WcfWsSecurityHeader: MessageHeader
                  {
                      public static readonly string WsseHeaderName = "Security";
                      public static readonly string WsseNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
                      public static readonly string WsuPrefix = "wsu";
                      public static readonly string WsuNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
                      public static readonly string SecurityHeaderXml =
              @"<UsernameToken xmlns:wsu=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"">
                      <Username>LoginID here</Username>
                      <Password Type=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"">Password here</Password>
                      <Nonce>Nonce in Base64 here</Nonce>
                      <wsu:Created>Created time here (2010-10-13T10:50:05Z)</wsu:Created>
                  </UsernameToken>";
               
                      private static readonly Random Rnd = new Random();
               
                      public string Username { get; private set; }
                      public string Password { get; private set; }
                      public DateTime CreatedUtc { get; private set; }
                      public ulong Nonce { get; set; }
               
                      public WcfWsSecurityHeader( string username, string password, DateTime createdUtc, ulong nonce )
                      {
                          Username = username;
                          Password = password;
                          CreatedUtc = createdUtc;
                          Nonce = nonce;
                      }
               
                      #region Overrides of MessageHeaderInfo
               
                      public override string Name
                      {
                          get { return WsseHeaderName; }
                      }
               
                      public override string Namespace
                      {
                          get { return WsseNamespace; }
                      }
               
                      #endregion
               
                      public override bool MustUnderstand
                      {
                          get { return true; }
                      }
               
                      #region Overrides of MessageHeader
               
                      protected override void OnWriteHeaderContents( XmlDictionaryWriter writer, MessageVersion messageVersion )
                      {
                          var xmlDoc = new XmlDocument();
                          xmlDoc.LoadXml(SecurityHeaderXml);
               
                          var nsm = new XmlNamespaceManager(xmlDoc.NameTable);
                          nsm.AddNamespace(WsuPrefix, WsuNamespace);
               
                          var loginIDNode = xmlDoc.SelectSingleNode(@"//UsernameToken/Username", nsm);
                          var passwordNode = xmlDoc.SelectSingleNode(@"//UsernameToken/Password", nsm);
                          var nonceNode = xmlDoc.SelectSingleNode(@"//UsernameToken/Nonce", nsm);
                          var createdNode = xmlDoc.SelectSingleNode(@"//UsernameToken/wsu:Created", nsm);
               
                          loginIDNode.InnerText = Username;
                          passwordNode.InnerText = Password;
                          createdNode.InnerText = CreatedUtc.ToString("s") + @"Z";
                          nonceNode.InnerText = Convert.ToBase64String(BitConverter.GetBytes(Nonce));
               
                          writer.WriteRaw(xmlDoc.OuterXml);
                      }
               
                      #endregion
               
                      public static ulong GetULongRandom()
                      {
                          var rndBytes = new byte[8];
                          Rnd.NextBytes(rndBytes);
               
                          return BitConverter.ToUInt64(rndBytes, 0);
                      }
               
                  }
              }


            Использование:

            ExpandedWrap disabled
              namespace NMS
              {
                  public static class ServiceInvoker
                  {
                      public static readonly string ClntVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
               
                      public static string Login { get; set; }
                      public static string Password { get; set; }
                      public static int CompanyId { get; set; }
               
                      private static WcfWsSecurityHeader CreateSecurityHeader()
                      {
                          return new WcfWsSecurityHeader(Login, Password, DateTime.Now.ToUniversalTime(), WcfWsSecurityHeader.GetULongRandom());
                      }
               
                      public static Resp Close(string br, string closeStatus, string current)
                      {
                          using (var clntWcf = new WebServiceSoapClient())
                          using (new OperationContextScope(clntWcf.InnerChannel))
                          {
                              OperationContext.Current.OutgoingMessageHeaders.Add(CreateSecurityHeader());
               
                              return clntWcf.Close(ClntVersion, br, closeStatus, current);
                          }
                      }
                   }
                }


            Примерно так.
              Felan
              спасибо. да я примерно так и делал по Вашему совету. еще нашел вот это

              единственное теперь что остается под вопросом так вот это :

              ExpandedWrap disabled
                <soapenv:Body>
                     <body/>
                </soapenv:Body>


              Добавлено
              судя по всему для этого нужен наследник от BodyWriter
              Сообщение отредактировано: mrbrooks -
                Цитата mrbrooks @
                судя по всему для этого нужен наследник от BodyWriter

                Ну это я уже не знаю. В моем случае был нормальный WSDL, поэтому студия мне все остальное сгенерила.

                Вообще-то, мне кажется, что все равно для Java должны быть какие-нибудь генераторы. WSDL вроде как общий стандарт, не зависящий от платформы.
                  Цитата Felan @
                  Вообще-то, мне кажется, что все равно для Java должны быть какие-нибудь генераторы. WSDL вроде как общий стандарт, не зависящий от платформы.

                  в моем случае студия сгенерировала не очень кошерный код, который требовал доработки рашпилем - по этому все фактически писал с нуля и главное - работает.
                  Большое спасибо Вам за помощь.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0287 ]   [ 16 queries used ]   [ Generated: 19.03.24, 10:09 GMT ]