Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.235.42.157] |
|
Сообщ.
#1
,
|
|
|
всем привет.
не подскажите как настроить wss в wsHttpBinding, такие как user, password, password type. Спасибо. |
Сообщ.
#2
,
|
|
|
Не представляю что в твоем случае означает password type, но вот пример стандартного сценария:
How To - Use Username Authentication with the SQL Membership Provider and Message Security in WCF |
Сообщ.
#3
,
|
|
|
Если я правильно понял, то тебе надо реализовать в сервисе WCF oasis-200401-wss-username-token-profile-1.0.pdf?
Если да, то в запасниках у меня нашлась только такая ссылка. В общем там надо сделать наследника от MessageHeader, который будет добавлять нужный заголовок в XML. А потом через OperationContextScope и OperationContext добавлять его. |
Сообщ.
#4
,
|
|
|
Felan
ага. типа того. грубо говоря мне нужно заслать нечто подобное: <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 и иже с ним. И что то я тут ни разу не преуспел Любопытно - что если формировать посылку руками и слать через HttpWebRequest - все получается и ответ не заставляет себя ждать. Но хочется заюзать WCF. Пока топчусь на месте. Felan спасибо за наводку. Попробую. Добавлено Цитата spicard @ Не представляю что в твоем случае означает password type, но вот пример стандартного сценария: это настройка через soapUi. как я понимаю это фича wss. Это кстати отражается в запросе к сервису приведенному мною выше. |
Сообщ.
#5
,
|
|
|
Цитата mrbrooks @ Так как сервис написан кажется на Java - студия не генерирует строготипизированный контракт. Это не важно, что на Java. Студия его и не будет генерить, потому как это относится к устаревшей технологии. WCF ее не поддерживает. Поэтому надо в ручную добавлять заголовки. Вот файл заголовка: 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); } } } Использование: 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); } } } } Примерно так. |
Сообщ.
#6
,
|
|
|
Felan
спасибо. да я примерно так и делал по Вашему совету. еще нашел вот это единственное теперь что остается под вопросом так вот это : <soapenv:Body> <body/> </soapenv:Body> Добавлено судя по всему для этого нужен наследник от BodyWriter |
Сообщ.
#7
,
|
|
|
Цитата mrbrooks @ судя по всему для этого нужен наследник от BodyWriter Ну это я уже не знаю. В моем случае был нормальный WSDL, поэтому студия мне все остальное сгенерила. Вообще-то, мне кажется, что все равно для Java должны быть какие-нибудь генераторы. WSDL вроде как общий стандарт, не зависящий от платформы. |
Сообщ.
#8
,
|
|
|
Цитата Felan @ Вообще-то, мне кажется, что все равно для Java должны быть какие-нибудь генераторы. WSDL вроде как общий стандарт, не зависящий от платформы. в моем случае студия сгенерировала не очень кошерный код, который требовал доработки рашпилем - по этому все фактически писал с нуля и главное - работает. Большое спасибо Вам за помощь. |