WSSecurityPolicy.cs 138 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Security
  5. {
  6. using System.Collections.Generic;
  7. using System.Collections.ObjectModel;
  8. using System.IO;
  9. using System.Runtime;
  10. using System.ServiceModel;
  11. using System.ServiceModel.Channels;
  12. using System.ServiceModel.Description;
  13. using System.ServiceModel.Security.Tokens;
  14. using System.Xml;
  15. abstract class WSSecurityPolicy
  16. {
  17. public static ContractDescription NullContract = new ContractDescription("null");
  18. public static ServiceEndpoint NullServiceEndpoint = new ServiceEndpoint(NullContract);
  19. public static XmlDocument doc = new XmlDocument();
  20. public const string WsspPrefix = "sp";
  21. public const string WspNamespace = MetadataStrings.WSPolicy.NamespaceUri; //@"http://schemas.xmlsoap.org/ws/2004/09/policy";
  22. public const string Wsp15Namespace = MetadataStrings.WSPolicy.NamespaceUri15;
  23. public const string WspPrefix = MetadataStrings.WSPolicy.Prefix; //"wsp";
  24. public const string MsspNamespace = @"http://schemas.microsoft.com/ws/2005/07/securitypolicy";
  25. public const string MsspPrefix = "mssp";
  26. public const string PolicyName = MetadataStrings.WSPolicy.Elements.Policy; //"Policy";
  27. public const string OptionalName = "Optional";
  28. public const string TrueName = "true";
  29. public const string FalseName = "false";
  30. public const string SymmetricBindingName = "SymmetricBinding";
  31. public const string AsymmetricBindingName = "AsymmetricBinding";
  32. public const string TransportBindingName = "TransportBinding";
  33. public const string OnlySignEntireHeadersAndBodyName = "OnlySignEntireHeadersAndBody";
  34. public const string ProtectionTokenName = "ProtectionToken";
  35. public const string InitiatorTokenName = "InitiatorToken";
  36. public const string RecipientTokenName = "RecipientToken";
  37. public const string TransportTokenName = "TransportToken";
  38. public const string AlgorithmSuiteName = "AlgorithmSuite";
  39. public const string LaxName = "Lax";
  40. public const string LaxTsLastName = "LaxTsLast";
  41. public const string LaxTsFirstName = "LaxTsFirst";
  42. public const string StrictName = "Strict";
  43. public const string IncludeTimestampName = "IncludeTimestamp";
  44. public const string EncryptBeforeSigningName = "EncryptBeforeSigning";
  45. public const string ProtectTokens = "ProtectTokens";
  46. public const string EncryptSignatureName = "EncryptSignature";
  47. public const string SignedSupportingTokensName = "SignedSupportingTokens";
  48. public const string EndorsingSupportingTokensName = "EndorsingSupportingTokens";
  49. public const string SignedEndorsingSupportingTokensName = "SignedEndorsingSupportingTokens";
  50. public const string Wss10Name = "Wss10";
  51. public const string MustSupportRefKeyIdentifierName = "MustSupportRefKeyIdentifier";
  52. public const string MustSupportRefIssuerSerialName = "MustSupportRefIssuerSerial";
  53. public const string MustSupportRefThumbprintName = "MustSupportRefThumbprint";
  54. public const string MustSupportRefEncryptedKeyName = "MustSupportRefEncryptedKey";
  55. public const string RequireSignatureConfirmationName = "RequireSignatureConfirmation";
  56. public const string MustSupportIssuedTokensName = "MustSupportIssuedTokens";
  57. public const string RequireClientEntropyName = "RequireClientEntropy";
  58. public const string RequireServerEntropyName = "RequireServerEntropy";
  59. public const string Wss11Name = "Wss11";
  60. public const string Trust10Name = "Trust10";
  61. public const string Trust13Name = "Trust13";
  62. public const string RequireAppliesTo = "RequireAppliesTo";
  63. public const string SignedPartsName = "SignedParts";
  64. public const string EncryptedPartsName = "EncryptedParts";
  65. public const string BodyName = "Body";
  66. public const string HeaderName = "Header";
  67. public const string NameName = "Name";
  68. public const string NamespaceName = "Namespace";
  69. public const string Basic128Name = "Basic128";
  70. public const string Basic192Name = "Basic192";
  71. public const string Basic256Name = "Basic256";
  72. public const string TripleDesName = "TripleDes";
  73. public const string Basic128Rsa15Name = "Basic128Rsa15";
  74. public const string Basic192Rsa15Name = "Basic192Rsa15";
  75. public const string Basic256Rsa15Name = "Basic256Rsa15";
  76. public const string TripleDesRsa15Name = "TripleDesRsa15";
  77. public const string Basic128Sha256Name = "Basic128Sha256";
  78. public const string Basic192Sha256Name = "Basic192Sha256";
  79. public const string Basic256Sha256Name = "Basic256Sha256";
  80. public const string TripleDesSha256Name = "TripleDesSha256";
  81. public const string Basic128Sha256Rsa15Name = "Basic128Sha256Rsa15";
  82. public const string Basic192Sha256Rsa15Name = "Basic192Sha256Rsa15";
  83. public const string Basic256Sha256Rsa15Name = "Basic256Sha256Rsa15";
  84. public const string TripleDesSha256Rsa15Name = "TripleDesSha256Rsa15";
  85. public const string IncludeTokenName = "IncludeToken";
  86. public const string KerberosTokenName = "KerberosToken";
  87. public const string X509TokenName = "X509Token";
  88. public const string IssuedTokenName = "IssuedToken";
  89. public const string UsernameTokenName = "UsernameToken";
  90. public const string RsaTokenName = "RsaToken";
  91. public const string KeyValueTokenName = "KeyValueToken";
  92. public const string SpnegoContextTokenName = "SpnegoContextToken";
  93. public const string SslContextTokenName = "SslContextToken";
  94. public const string SecureConversationTokenName = "SecureConversationToken";
  95. public const string WssGssKerberosV5ApReqToken11Name = "WssGssKerberosV5ApReqToken11";
  96. public const string RequireDerivedKeysName = "RequireDerivedKeys";
  97. public const string RequireIssuerSerialReferenceName = "RequireIssuerSerialReference";
  98. public const string RequireKeyIdentifierReferenceName = "RequireKeyIdentifierReference";
  99. public const string RequireThumbprintReferenceName = "RequireThumbprintReference";
  100. public const string WssX509V3Token10Name = "WssX509V3Token10";
  101. public const string WssUsernameToken10Name = "WssUsernameToken10";
  102. public const string RequestSecurityTokenTemplateName = "RequestSecurityTokenTemplate";
  103. public const string RequireExternalReferenceName = "RequireExternalReference";
  104. public const string RequireInternalReferenceName = "RequireInternalReference";
  105. public const string IssuerName = "Issuer";
  106. public const string RequireClientCertificateName = "RequireClientCertificate";
  107. public const string MustNotSendCancelName = "MustNotSendCancel";
  108. public const string MustNotSendAmendName = "MustNotSendAmend";
  109. public const string MustNotSendRenewName = "MustNotSendRenew";
  110. public const string LayoutName = "Layout";
  111. public const string BootstrapPolicyName = "BootstrapPolicy";
  112. public const string HttpsTokenName = "HttpsToken";
  113. public const string HttpBasicAuthenticationName = "HttpBasicAuthentication";
  114. public const string HttpDigestAuthenticationName = "HttpDigestAuthentication";
  115. bool _mustSupportRefKeyIdentifierName = false;
  116. bool _mustSupportRefIssuerSerialName = false;
  117. bool _mustSupportRefThumbprintName = false;
  118. bool _protectionTokenHasAsymmetricKey = false;
  119. public virtual XmlElement CreateWsspAssertion(string name)
  120. {
  121. return doc.CreateElement(WsspPrefix, name, this.WsspNamespaceUri);
  122. }
  123. public virtual bool IsWsspAssertion(XmlElement assertion)
  124. {
  125. return assertion.NamespaceURI == this.WsspNamespaceUri;
  126. }
  127. public virtual bool IsWsspAssertion(XmlElement assertion, string name)
  128. {
  129. return assertion.NamespaceURI == this.WsspNamespaceUri && assertion.LocalName == name;
  130. }
  131. public virtual bool IsMsspAssertion(XmlElement assertion, string name)
  132. {
  133. return assertion.NamespaceURI == MsspNamespace && assertion.LocalName == name;
  134. }
  135. public virtual bool TryImportWsspAssertion(ICollection<XmlElement> assertions, string name, out XmlElement assertion)
  136. {
  137. assertion = null;
  138. foreach (XmlElement e in assertions)
  139. {
  140. if (e.LocalName == name && e.NamespaceURI == this.WsspNamespaceUri)
  141. {
  142. assertion = e;
  143. assertions.Remove(e);
  144. return true;
  145. }
  146. }
  147. return false;
  148. }
  149. public virtual bool TryImportWsspAssertion(ICollection<XmlElement> assertions, string name)
  150. {
  151. return TryImportWsspAssertion(assertions, name, false);
  152. }
  153. public virtual bool TryImportWsspAssertion(ICollection<XmlElement> assertions, string name, bool isOptional)
  154. {
  155. foreach (XmlElement e in assertions)
  156. {
  157. if (e.LocalName == name && e.NamespaceURI == this.WsspNamespaceUri)
  158. {
  159. assertions.Remove(e);
  160. return true;
  161. }
  162. }
  163. return isOptional;
  164. }
  165. public virtual XmlElement CreateMsspAssertion(string name)
  166. {
  167. return doc.CreateElement(MsspPrefix, name, MsspNamespace);
  168. }
  169. public virtual bool CanImportAssertion(ICollection<XmlElement> assertions)
  170. {
  171. foreach (XmlElement e in assertions)
  172. {
  173. if (e.NamespaceURI == this.WsspNamespaceUri || e.NamespaceURI == WSSecurityPolicy.MsspNamespace)
  174. {
  175. return true;
  176. }
  177. }
  178. return false;
  179. }
  180. public abstract bool IsSecurityVersionSupported(MessageSecurityVersion version);
  181. public abstract MessageSecurityVersion GetSupportedMessageSecurityVersion(SecurityVersion version);
  182. public abstract string WsspNamespaceUri { get; }
  183. public abstract TrustDriver TrustDriver { get; }
  184. public virtual string AlwaysToRecipientUri
  185. {
  186. get { return this.WsspNamespaceUri + @"/IncludeToken/AlwaysToRecipient"; }
  187. }
  188. public virtual string NeverUri
  189. {
  190. get { return this.WsspNamespaceUri + @"/IncludeToken/Never"; }
  191. }
  192. public virtual string OnceUri
  193. {
  194. get { return this.WsspNamespaceUri + @"/IncludeToken/Once"; }
  195. }
  196. public virtual string AlwaysToInitiatorUri
  197. {
  198. get { return this.WsspNamespaceUri + @"/IncludeToken/AlwaysToInitiator"; }
  199. }
  200. public virtual bool TryImportMsspAssertion(ICollection<XmlElement> assertions, string name)
  201. {
  202. foreach (XmlElement e in assertions)
  203. {
  204. if (e.LocalName == name && e.NamespaceURI == MsspNamespace)
  205. {
  206. assertions.Remove(e);
  207. return true;
  208. }
  209. }
  210. return false;
  211. }
  212. public virtual XmlElement CreateWspPolicyWrapper(MetadataExporter exporter, params XmlElement[] nestedAssertions)
  213. {
  214. XmlElement result = doc.CreateElement(WspPrefix, PolicyName, exporter.PolicyVersion.Namespace);
  215. if (nestedAssertions != null)
  216. {
  217. foreach (XmlElement e in nestedAssertions)
  218. {
  219. if (e != null)
  220. {
  221. result.AppendChild(e);
  222. }
  223. }
  224. }
  225. return result;
  226. }
  227. public virtual XmlElement CreateWsspSignedPartsAssertion(MessagePartSpecification parts)
  228. {
  229. if (parts == null)
  230. {
  231. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("parts");
  232. }
  233. XmlElement result;
  234. if (parts.IsEmpty())
  235. {
  236. result = null;
  237. }
  238. else
  239. {
  240. result = CreateWsspAssertion(SignedPartsName);
  241. if (parts.IsBodyIncluded)
  242. {
  243. result.AppendChild(CreateWsspAssertion(BodyName));
  244. }
  245. foreach (XmlQualifiedName header in parts.HeaderTypes)
  246. {
  247. result.AppendChild(CreateWsspHeaderAssertion(header));
  248. }
  249. }
  250. return result;
  251. }
  252. public virtual XmlElement CreateWsspEncryptedPartsAssertion(MessagePartSpecification parts)
  253. {
  254. if (parts == null)
  255. {
  256. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("parts");
  257. }
  258. XmlElement result;
  259. if (parts.IsEmpty())
  260. {
  261. result = null;
  262. }
  263. else
  264. {
  265. result = CreateWsspAssertion(EncryptedPartsName);
  266. if (parts.IsBodyIncluded)
  267. {
  268. result.AppendChild(CreateWsspAssertion(BodyName));
  269. }
  270. foreach (XmlQualifiedName header in parts.HeaderTypes)
  271. {
  272. result.AppendChild(CreateWsspHeaderAssertion(header));
  273. }
  274. }
  275. return result;
  276. }
  277. public virtual MessagePartSpecification TryGetProtectedParts(XmlElement assertion)
  278. {
  279. MessagePartSpecification parts = new MessagePartSpecification();
  280. foreach (XmlNode node in assertion.ChildNodes)
  281. {
  282. if (node.NodeType == XmlNodeType.Whitespace || node.NodeType == XmlNodeType.Comment)
  283. {
  284. continue;
  285. }
  286. else if (node is XmlElement)
  287. {
  288. XmlElement element = (XmlElement)node;
  289. if (IsWsspAssertion(element, BodyName))
  290. {
  291. parts.IsBodyIncluded = true;
  292. }
  293. else if (IsWsspAssertion(element, HeaderName))
  294. {
  295. string name = element.GetAttribute(NameName);
  296. string ns = element.GetAttribute(NamespaceName);
  297. if (ns == null)
  298. {
  299. parts = null;
  300. break;
  301. }
  302. parts.HeaderTypes.Add(new XmlQualifiedName(name, ns));
  303. }
  304. else
  305. {
  306. parts = null;
  307. break;
  308. }
  309. }
  310. else
  311. {
  312. parts = null;
  313. break;
  314. }
  315. }
  316. return parts;
  317. }
  318. public virtual bool TryImportWsspEncryptedPartsAssertion(ICollection<XmlElement> assertions, out MessagePartSpecification parts, out XmlElement assertion)
  319. {
  320. if (TryImportWsspAssertion(assertions, EncryptedPartsName, out assertion))
  321. {
  322. parts = TryGetProtectedParts(assertion);
  323. }
  324. else
  325. {
  326. parts = null;
  327. }
  328. return parts != null;
  329. }
  330. public virtual bool TryImportWsspSignedPartsAssertion(ICollection<XmlElement> assertions, out MessagePartSpecification parts, out XmlElement assertion)
  331. {
  332. if (TryImportWsspAssertion(assertions, SignedPartsName, out assertion))
  333. {
  334. parts = TryGetProtectedParts(assertion);
  335. }
  336. else
  337. {
  338. parts = null;
  339. }
  340. return parts != null;
  341. }
  342. public virtual XmlElement CreateWsspHeaderAssertion(XmlQualifiedName header)
  343. {
  344. XmlElement result = CreateWsspAssertion(HeaderName);
  345. result.SetAttribute(NameName, header.Name);
  346. result.SetAttribute(NamespaceName, header.Namespace);
  347. return result;
  348. }
  349. public virtual XmlElement CreateWsspSymmetricBindingAssertion(MetadataExporter exporter, PolicyConversionContext policyContext, SymmetricSecurityBindingElement binding)
  350. {
  351. if (binding == null)
  352. {
  353. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("binding");
  354. }
  355. XmlElement result = CreateWsspAssertion(SymmetricBindingName);
  356. result.AppendChild(
  357. CreateWspPolicyWrapper(
  358. exporter,
  359. CreateWsspProtectionTokenAssertion(exporter, binding.ProtectionTokenParameters),
  360. CreateWsspAlgorithmSuiteAssertion(exporter, binding.DefaultAlgorithmSuite),
  361. CreateWsspLayoutAssertion(exporter, binding.SecurityHeaderLayout),
  362. CreateWsspIncludeTimestampAssertion(binding.IncludeTimestamp),
  363. CreateWsspEncryptBeforeSigningAssertion(binding.MessageProtectionOrder),
  364. CreateWsspEncryptSignatureAssertion(policyContext, binding),
  365. CreateWsspProtectTokensAssertion(binding),
  366. CreateWsspAssertion(OnlySignEntireHeadersAndBodyName)
  367. ));
  368. return result;
  369. }
  370. public virtual bool TryGetNestedPolicyAlternatives(MetadataImporter importer, XmlElement assertion, out Collection<Collection<XmlElement>> alternatives)
  371. {
  372. alternatives = null;
  373. XmlElement policyElement = null;
  374. foreach (XmlNode node in assertion.ChildNodes)
  375. {
  376. if (node is XmlElement && node.LocalName == PolicyName && (node.NamespaceURI == WspNamespace || node.NamespaceURI == Wsp15Namespace))
  377. {
  378. policyElement = (XmlElement)node;
  379. break;
  380. }
  381. }
  382. if (policyElement == null)
  383. {
  384. alternatives = null;
  385. }
  386. else
  387. {
  388. IEnumerable<IEnumerable<XmlElement>> enumerableAlternatives = importer.NormalizePolicy(new XmlElement[] { policyElement });
  389. alternatives = new Collection<Collection<XmlElement>>();
  390. foreach (IEnumerable<XmlElement> enumerableAlternative in enumerableAlternatives)
  391. {
  392. Collection<XmlElement> alternative = new Collection<XmlElement>();
  393. alternatives.Add(alternative);
  394. foreach (XmlElement e in enumerableAlternative)
  395. {
  396. alternative.Add(e);
  397. }
  398. }
  399. }
  400. return alternatives != null;
  401. }
  402. public virtual bool TryImportWsspSymmetricBindingAssertion(MetadataImporter importer, PolicyConversionContext policyContext, ICollection<XmlElement> assertions, out SymmetricSecurityBindingElement binding, out XmlElement assertion)
  403. {
  404. binding = null;
  405. Collection<Collection<XmlElement>> alternatives;
  406. if (TryImportWsspAssertion(assertions, SymmetricBindingName, out assertion)
  407. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  408. {
  409. foreach (Collection<XmlElement> alternative in alternatives)
  410. {
  411. MessageProtectionOrder order;
  412. bool protectTokens;
  413. binding = new SymmetricSecurityBindingElement();
  414. if (TryImportWsspProtectionTokenAssertion(importer, policyContext, alternative, binding)
  415. && TryImportWsspAlgorithmSuiteAssertion(importer, alternative, binding)
  416. && TryImportWsspLayoutAssertion(importer, alternative, binding)
  417. && TryImportWsspIncludeTimestampAssertion(alternative, binding)
  418. && TryImportMessageProtectionOrderAssertions(alternative, out order)
  419. && TryImportWsspProtectTokensAssertion(alternative, out protectTokens)
  420. && TryImportWsspAssertion(alternative, OnlySignEntireHeadersAndBodyName, true)
  421. && alternative.Count == 0)
  422. {
  423. binding.MessageProtectionOrder = order;
  424. binding.ProtectTokens = protectTokens;
  425. break;
  426. }
  427. else
  428. {
  429. binding = null;
  430. }
  431. }
  432. }
  433. return binding != null;
  434. }
  435. public virtual XmlElement CreateWsspAsymmetricBindingAssertion(MetadataExporter exporter, PolicyConversionContext policyContext, AsymmetricSecurityBindingElement binding)
  436. {
  437. if (binding == null)
  438. {
  439. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("binding");
  440. }
  441. XmlElement result = CreateWsspAssertion(AsymmetricBindingName);
  442. result.AppendChild(
  443. CreateWspPolicyWrapper(
  444. exporter,
  445. CreateWsspInitiatorTokenAssertion(exporter, binding.InitiatorTokenParameters),
  446. CreateWsspRecipientTokenAssertion(exporter, binding.RecipientTokenParameters),
  447. CreateWsspAlgorithmSuiteAssertion(exporter, binding.DefaultAlgorithmSuite),
  448. CreateWsspLayoutAssertion(exporter, binding.SecurityHeaderLayout),
  449. CreateWsspIncludeTimestampAssertion(binding.IncludeTimestamp),
  450. CreateWsspEncryptBeforeSigningAssertion(binding.MessageProtectionOrder),
  451. CreateWsspEncryptSignatureAssertion(policyContext, binding),
  452. CreateWsspProtectTokensAssertion(binding),
  453. CreateWsspAssertion(OnlySignEntireHeadersAndBodyName)
  454. ));
  455. return result;
  456. }
  457. public virtual bool TryImportWsspAsymmetricBindingAssertion(MetadataImporter importer, PolicyConversionContext policyContext, ICollection<XmlElement> assertions, out AsymmetricSecurityBindingElement binding, out XmlElement assertion)
  458. {
  459. binding = null;
  460. Collection<Collection<XmlElement>> alternatives;
  461. if (TryImportWsspAssertion(assertions, AsymmetricBindingName, out assertion)
  462. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  463. {
  464. foreach (Collection<XmlElement> alternative in alternatives)
  465. {
  466. MessageProtectionOrder order;
  467. bool protectTokens;
  468. binding = new AsymmetricSecurityBindingElement();
  469. if (TryImportWsspInitiatorTokenAssertion(importer, policyContext, alternative, binding)
  470. && TryImportWsspRecipientTokenAssertion(importer, policyContext, alternative, binding)
  471. && TryImportWsspAlgorithmSuiteAssertion(importer, alternative, binding)
  472. && TryImportWsspLayoutAssertion(importer, alternative, binding)
  473. && TryImportWsspIncludeTimestampAssertion(alternative, binding)
  474. && TryImportMessageProtectionOrderAssertions(alternative, out order)
  475. && TryImportWsspProtectTokensAssertion(alternative, out protectTokens)
  476. && TryImportWsspAssertion(alternative, OnlySignEntireHeadersAndBodyName, true)
  477. && alternative.Count == 0)
  478. {
  479. binding.MessageProtectionOrder = order;
  480. binding.ProtectTokens = protectTokens;
  481. break;
  482. }
  483. else
  484. {
  485. binding = null;
  486. }
  487. }
  488. }
  489. return binding != null;
  490. }
  491. public virtual XmlElement CreateWsspTransportBindingAssertion(MetadataExporter exporter, TransportSecurityBindingElement binding, XmlElement transportTokenAssertion)
  492. {
  493. XmlElement result = CreateWsspAssertion(TransportBindingName);
  494. result.AppendChild(
  495. CreateWspPolicyWrapper(
  496. exporter,
  497. CreateWsspTransportTokenAssertion(exporter, transportTokenAssertion),
  498. CreateWsspAlgorithmSuiteAssertion(exporter, binding.DefaultAlgorithmSuite),
  499. CreateWsspLayoutAssertion(exporter, binding.SecurityHeaderLayout),
  500. CreateWsspIncludeTimestampAssertion(binding.IncludeTimestamp)
  501. ));
  502. return result;
  503. }
  504. public virtual bool TryImportWsspTransportBindingAssertion(MetadataImporter importer, ICollection<XmlElement> assertions, out TransportSecurityBindingElement binding, out XmlElement assertion)
  505. {
  506. binding = null;
  507. Collection<Collection<XmlElement>> alternatives;
  508. if (TryImportWsspAssertion(assertions, TransportBindingName, out assertion)
  509. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  510. {
  511. foreach (Collection<XmlElement> alternative in alternatives)
  512. {
  513. XmlElement transportTokenAssertion;
  514. binding = new TransportSecurityBindingElement();
  515. if (TryImportWsspTransportTokenAssertion(importer, alternative, out transportTokenAssertion)
  516. && TryImportWsspAlgorithmSuiteAssertion(importer, alternative, binding)
  517. && TryImportWsspLayoutAssertion(importer, alternative, binding)
  518. && TryImportWsspIncludeTimestampAssertion(alternative, binding)
  519. && alternative.Count == 0)
  520. {
  521. if (false == importer.State.ContainsKey(SecurityBindingElementImporter.InSecureConversationBootstrapBindingImportMode))
  522. {
  523. // The transportTokenAssertion should be consumed by the transport binding importer
  524. // for all primary bindings. However, for secure conversation bootstrap bindings
  525. // the bootstrap policy does not contain any transport assertions, so adding the
  526. // transport token assertion to the collection of unimported assertions would
  527. // increase the likelihood of policy import failure due to unrecognized assertions.
  528. assertions.Add(transportTokenAssertion);
  529. }
  530. break;
  531. }
  532. else
  533. {
  534. binding = null;
  535. }
  536. }
  537. }
  538. return binding != null;
  539. }
  540. public virtual XmlElement CreateWsspWssAssertion(MetadataExporter exporter, SecurityBindingElement binding)
  541. {
  542. if (binding == null)
  543. {
  544. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("binding");
  545. }
  546. if (binding.MessageSecurityVersion.SecurityVersion == SecurityVersion.WSSecurity10)
  547. {
  548. return CreateWsspWss10Assertion(exporter);
  549. }
  550. else if (binding.MessageSecurityVersion.SecurityVersion == SecurityVersion.WSSecurity11)
  551. {
  552. if (binding is SymmetricSecurityBindingElement)
  553. {
  554. return CreateWsspWss11Assertion(exporter, ((SymmetricSecurityBindingElement)binding).RequireSignatureConfirmation);
  555. }
  556. else if (binding is AsymmetricSecurityBindingElement)
  557. {
  558. return CreateWsspWss11Assertion(exporter, ((AsymmetricSecurityBindingElement)binding).RequireSignatureConfirmation);
  559. }
  560. else
  561. {
  562. return CreateWsspWss11Assertion(exporter, false);
  563. }
  564. }
  565. else
  566. {
  567. return null;
  568. }
  569. }
  570. public virtual bool TryImportWsspWssAssertion(MetadataImporter importer, ICollection<XmlElement> assertions, SecurityBindingElement binding, out XmlElement assertion)
  571. {
  572. if (binding == null)
  573. {
  574. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("binding");
  575. }
  576. if (assertions == null)
  577. {
  578. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("assertions");
  579. }
  580. bool result = true;
  581. Collection<Collection<XmlElement>> alternatives;
  582. if (TryImportWsspAssertion(assertions, Wss10Name, out assertion))
  583. {
  584. if (TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  585. {
  586. foreach (Collection<XmlElement> alternative in alternatives)
  587. {
  588. TryImportWsspAssertion(alternative, MustSupportRefKeyIdentifierName);
  589. TryImportWsspAssertion(alternative, MustSupportRefIssuerSerialName);
  590. if (alternative.Count == 0)
  591. {
  592. binding.MessageSecurityVersion = this.GetSupportedMessageSecurityVersion(SecurityVersion.WSSecurity10);
  593. result = true;
  594. break;
  595. }
  596. else
  597. {
  598. result = false;
  599. }
  600. }
  601. }
  602. }
  603. else if (TryImportWsspAssertion(assertions, Wss11Name, out assertion))
  604. {
  605. if (TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  606. {
  607. foreach (Collection<XmlElement> alternative in alternatives)
  608. {
  609. TryImportWsspAssertion(alternative, MustSupportRefKeyIdentifierName);
  610. TryImportWsspAssertion(alternative, MustSupportRefIssuerSerialName);
  611. TryImportWsspAssertion(alternative, MustSupportRefThumbprintName);
  612. TryImportWsspAssertion(alternative, MustSupportRefEncryptedKeyName);
  613. bool requireSignatureConfirmation = TryImportWsspAssertion(alternative, RequireSignatureConfirmationName);
  614. if (alternative.Count == 0)
  615. {
  616. binding.MessageSecurityVersion = this.GetSupportedMessageSecurityVersion(SecurityVersion.WSSecurity11);
  617. if (binding is SymmetricSecurityBindingElement)
  618. {
  619. ((SymmetricSecurityBindingElement)binding).RequireSignatureConfirmation = requireSignatureConfirmation;
  620. }
  621. else if (binding is AsymmetricSecurityBindingElement)
  622. {
  623. ((AsymmetricSecurityBindingElement)binding).RequireSignatureConfirmation = requireSignatureConfirmation;
  624. }
  625. result = true;
  626. break;
  627. }
  628. else
  629. {
  630. result = false;
  631. }
  632. }
  633. }
  634. }
  635. return result;
  636. }
  637. public virtual XmlElement CreateWsspWss10Assertion(MetadataExporter exporter)
  638. {
  639. XmlElement result = CreateWsspAssertion(Wss10Name);
  640. result.AppendChild(
  641. CreateWspPolicyWrapper(
  642. exporter,
  643. CreateWsspAssertionMustSupportRefKeyIdentifierName(),
  644. CreateWsspAssertionMustSupportRefIssuerSerialName()
  645. ));
  646. return result;
  647. }
  648. public virtual XmlElement CreateWsspWss11Assertion(MetadataExporter exporter, bool requireSignatureConfirmation)
  649. {
  650. XmlElement result = CreateWsspAssertion(Wss11Name);
  651. result.AppendChild(
  652. CreateWspPolicyWrapper(
  653. exporter,
  654. CreateWsspAssertionMustSupportRefKeyIdentifierName(),
  655. CreateWsspAssertionMustSupportRefIssuerSerialName(),
  656. CreateWsspAssertionMustSupportRefThumbprintName(),
  657. CreateWsspAssertionMustSupportRefEncryptedKeyName(),
  658. CreateWsspRequireSignatureConformationAssertion(requireSignatureConfirmation)
  659. ));
  660. return result;
  661. }
  662. public virtual XmlElement CreateWsspAssertionMustSupportRefKeyIdentifierName()
  663. {
  664. if (_mustSupportRefKeyIdentifierName)
  665. {
  666. return CreateWsspAssertion(MustSupportRefKeyIdentifierName);
  667. }
  668. else
  669. {
  670. return null;
  671. }
  672. }
  673. public virtual XmlElement CreateWsspAssertionMustSupportRefIssuerSerialName()
  674. {
  675. if (_mustSupportRefIssuerSerialName)
  676. {
  677. return CreateWsspAssertion(MustSupportRefIssuerSerialName);
  678. }
  679. else
  680. {
  681. return null;
  682. }
  683. }
  684. public virtual XmlElement CreateWsspAssertionMustSupportRefThumbprintName()
  685. {
  686. if (_mustSupportRefThumbprintName)
  687. {
  688. return CreateWsspAssertion(MustSupportRefThumbprintName);
  689. }
  690. else
  691. {
  692. return null;
  693. }
  694. }
  695. public virtual XmlElement CreateWsspAssertionMustSupportRefEncryptedKeyName()
  696. {
  697. // protectionTokenHasAsymmetricKey is only set to true for a SymmetricBindingElement having an asymmetric key
  698. if (_protectionTokenHasAsymmetricKey)
  699. {
  700. return CreateWsspAssertion(MustSupportRefEncryptedKeyName);
  701. }
  702. else
  703. {
  704. return null;
  705. }
  706. }
  707. public virtual XmlElement CreateWsspRequireSignatureConformationAssertion(bool requireSignatureConfirmation)
  708. {
  709. if (requireSignatureConfirmation)
  710. {
  711. return CreateWsspAssertion(RequireSignatureConfirmationName);
  712. }
  713. else
  714. {
  715. return null;
  716. }
  717. }
  718. public abstract XmlElement CreateWsspTrustAssertion(MetadataExporter exporter, SecurityKeyEntropyMode keyEntropyMode);
  719. public abstract bool TryImportWsspTrustAssertion(MetadataImporter importer, ICollection<XmlElement> assertions, SecurityBindingElement binding, out XmlElement assertion);
  720. protected XmlElement CreateWsspTrustAssertion(string trustName, MetadataExporter exporter, SecurityKeyEntropyMode keyEntropyMode)
  721. {
  722. XmlElement result = CreateWsspAssertion(trustName);
  723. result.AppendChild(
  724. CreateWspPolicyWrapper(
  725. exporter,
  726. CreateWsspAssertion(MustSupportIssuedTokensName),
  727. CreateWsspRequireClientEntropyAssertion(keyEntropyMode),
  728. CreateWsspRequireServerEntropyAssertion(keyEntropyMode)
  729. ));
  730. return result;
  731. }
  732. protected bool TryImportWsspTrustAssertion(string trustName, MetadataImporter importer, ICollection<XmlElement> assertions, SecurityBindingElement binding, out XmlElement assertion)
  733. {
  734. if (binding == null)
  735. {
  736. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("binding");
  737. }
  738. if (assertions == null)
  739. {
  740. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("assertions");
  741. }
  742. bool result = true;
  743. Collection<Collection<XmlElement>> alternatives;
  744. if (TryImportWsspAssertion(assertions, trustName, out assertion)
  745. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  746. {
  747. foreach (Collection<XmlElement> alternative in alternatives)
  748. {
  749. TryImportWsspAssertion(alternative, MustSupportIssuedTokensName);
  750. bool requireClientEntropy = TryImportWsspAssertion(alternative, RequireClientEntropyName);
  751. bool requireServerEntropy = TryImportWsspAssertion(alternative, RequireServerEntropyName);
  752. if (trustName == Trust13Name)
  753. {
  754. // We are just reading this optional element.
  755. TryImportWsspAssertion(alternative, RequireAppliesTo);
  756. }
  757. if (alternative.Count == 0)
  758. {
  759. if (requireClientEntropy)
  760. {
  761. if (requireServerEntropy)
  762. {
  763. binding.KeyEntropyMode = SecurityKeyEntropyMode.CombinedEntropy;
  764. }
  765. else
  766. {
  767. binding.KeyEntropyMode = SecurityKeyEntropyMode.ClientEntropy;
  768. }
  769. }
  770. else if (requireServerEntropy)
  771. {
  772. binding.KeyEntropyMode = SecurityKeyEntropyMode.ServerEntropy;
  773. }
  774. result = true;
  775. break;
  776. }
  777. else
  778. {
  779. result = false;
  780. }
  781. }
  782. }
  783. return result;
  784. }
  785. public virtual XmlElement CreateWsspRequireClientEntropyAssertion(SecurityKeyEntropyMode keyEntropyMode)
  786. {
  787. if (keyEntropyMode == SecurityKeyEntropyMode.ClientEntropy || keyEntropyMode == SecurityKeyEntropyMode.CombinedEntropy)
  788. {
  789. return CreateWsspAssertion(RequireClientEntropyName);
  790. }
  791. else
  792. {
  793. return null;
  794. }
  795. }
  796. public virtual XmlElement CreateWsspRequireServerEntropyAssertion(SecurityKeyEntropyMode keyEntropyMode)
  797. {
  798. if (keyEntropyMode == SecurityKeyEntropyMode.ServerEntropy || keyEntropyMode == SecurityKeyEntropyMode.CombinedEntropy)
  799. {
  800. return CreateWsspAssertion(RequireServerEntropyName);
  801. }
  802. else
  803. {
  804. return null;
  805. }
  806. }
  807. public virtual Collection<XmlElement> CreateWsspSupportingTokensAssertion(MetadataExporter exporter, Collection<SecurityTokenParameters> signed, Collection<SecurityTokenParameters> signedEncrypted, Collection<SecurityTokenParameters> endorsing, Collection<SecurityTokenParameters> signedEndorsing, Collection<SecurityTokenParameters> optionalSigned, Collection<SecurityTokenParameters> optionalSignedEncrypted, Collection<SecurityTokenParameters> optionalEndorsing, Collection<SecurityTokenParameters> optionalSignedEndorsing)
  808. {
  809. return CreateWsspSupportingTokensAssertion(exporter, signed, signedEncrypted, endorsing, signedEndorsing, optionalSigned, optionalSignedEncrypted, optionalEndorsing, optionalSignedEndorsing, null);
  810. }
  811. public virtual Collection<XmlElement> CreateWsspSupportingTokensAssertion(MetadataExporter exporter, Collection<SecurityTokenParameters> signed, Collection<SecurityTokenParameters> signedEncrypted, Collection<SecurityTokenParameters> endorsing, Collection<SecurityTokenParameters> signedEndorsing, Collection<SecurityTokenParameters> optionalSigned, Collection<SecurityTokenParameters> optionalSignedEncrypted, Collection<SecurityTokenParameters> optionalEndorsing, Collection<SecurityTokenParameters> optionalSignedEndorsing, AddressingVersion addressingVersion)
  812. {
  813. Collection<XmlElement> supportingTokenAssertions = new Collection<XmlElement>();
  814. // Signed Supporting Tokens
  815. XmlElement supportingTokenAssertion = CreateWsspSignedSupportingTokensAssertion(exporter, signed, signedEncrypted, optionalSigned, optionalSignedEncrypted);
  816. if (supportingTokenAssertion != null)
  817. supportingTokenAssertions.Add(supportingTokenAssertion);
  818. // Endorsing Supporting Tokens.
  819. supportingTokenAssertion = CreateWsspEndorsingSupportingTokensAssertion(exporter, endorsing, optionalEndorsing, addressingVersion);
  820. if (supportingTokenAssertion != null)
  821. supportingTokenAssertions.Add(supportingTokenAssertion);
  822. // Signed Endorsing Supporting Tokens.
  823. supportingTokenAssertion = CreateWsspSignedEndorsingSupportingTokensAssertion(exporter, signedEndorsing, optionalSignedEndorsing, addressingVersion);
  824. if (supportingTokenAssertion != null)
  825. supportingTokenAssertions.Add(supportingTokenAssertion);
  826. return supportingTokenAssertions;
  827. }
  828. protected XmlElement CreateWsspSignedSupportingTokensAssertion(MetadataExporter exporter, Collection<SecurityTokenParameters> signed, Collection<SecurityTokenParameters> signedEncrypted, Collection<SecurityTokenParameters> optionalSigned, Collection<SecurityTokenParameters> optionalSignedEncrypted)
  829. {
  830. XmlElement result;
  831. if ((signed == null || signed.Count == 0)
  832. && (signedEncrypted == null || signedEncrypted.Count == 0)
  833. && (optionalSigned == null || optionalSigned.Count == 0)
  834. && (optionalSignedEncrypted == null || optionalSignedEncrypted.Count == 0))
  835. {
  836. result = null;
  837. }
  838. else
  839. {
  840. XmlElement policy = CreateWspPolicyWrapper(exporter);
  841. if (signed != null)
  842. {
  843. foreach (SecurityTokenParameters p in signed)
  844. {
  845. policy.AppendChild(CreateTokenAssertion(exporter, p));
  846. }
  847. }
  848. if (signedEncrypted != null)
  849. {
  850. foreach (SecurityTokenParameters p in signedEncrypted)
  851. {
  852. policy.AppendChild(CreateTokenAssertion(exporter, p));
  853. }
  854. }
  855. if (optionalSigned != null)
  856. {
  857. foreach (SecurityTokenParameters p in optionalSigned)
  858. {
  859. policy.AppendChild(CreateTokenAssertion(exporter, p, true));
  860. }
  861. }
  862. if (optionalSignedEncrypted != null)
  863. {
  864. foreach (SecurityTokenParameters p in optionalSignedEncrypted)
  865. {
  866. policy.AppendChild(CreateTokenAssertion(exporter, p, true));
  867. }
  868. }
  869. result = CreateWsspAssertion(SignedSupportingTokensName);
  870. result.AppendChild(policy);
  871. }
  872. return result;
  873. }
  874. protected XmlElement CreateWsspEndorsingSupportingTokensAssertion(MetadataExporter exporter, Collection<SecurityTokenParameters> endorsing, Collection<SecurityTokenParameters> optionalEndorsing, AddressingVersion addressingVersion)
  875. {
  876. return CreateWsspiSupportingTokensAssertion(exporter, endorsing, optionalEndorsing, addressingVersion, EndorsingSupportingTokensName);
  877. }
  878. protected XmlElement CreateWsspSignedEndorsingSupportingTokensAssertion(MetadataExporter exporter, Collection<SecurityTokenParameters> signedEndorsing, Collection<SecurityTokenParameters> optionalSignedEndorsing, AddressingVersion addressingVersion)
  879. {
  880. return CreateWsspiSupportingTokensAssertion(exporter, signedEndorsing, optionalSignedEndorsing, addressingVersion, SignedEndorsingSupportingTokensName);
  881. }
  882. protected XmlElement CreateWsspiSupportingTokensAssertion(MetadataExporter exporter, Collection<SecurityTokenParameters> endorsing, Collection<SecurityTokenParameters> optionalEndorsing, AddressingVersion addressingVersion, string assertionName)
  883. {
  884. XmlElement result;
  885. bool hasAssymetricKey = false;
  886. if ((endorsing == null || endorsing.Count == 0)
  887. && (optionalEndorsing == null || optionalEndorsing.Count == 0))
  888. {
  889. result = null;
  890. }
  891. else
  892. {
  893. XmlElement policy = CreateWspPolicyWrapper(exporter);
  894. if (endorsing != null)
  895. {
  896. foreach (SecurityTokenParameters p in endorsing)
  897. {
  898. if (p.HasAsymmetricKey)
  899. hasAssymetricKey = true;
  900. policy.AppendChild(CreateTokenAssertion(exporter, p));
  901. }
  902. }
  903. if (optionalEndorsing != null)
  904. {
  905. foreach (SecurityTokenParameters p in optionalEndorsing)
  906. {
  907. if (p.HasAsymmetricKey)
  908. hasAssymetricKey = true;
  909. policy.AppendChild(CreateTokenAssertion(exporter, p, true));
  910. }
  911. }
  912. if (addressingVersion != null && AddressingVersion.None != addressingVersion)
  913. {
  914. // only add assertion to sign the 'To' only if an assymetric key is found
  915. if (hasAssymetricKey)
  916. {
  917. policy.AppendChild(
  918. CreateWsspSignedPartsAssertion(
  919. new MessagePartSpecification(new XmlQualifiedName(AddressingStrings.To, addressingVersion.Namespace))));
  920. }
  921. }
  922. result = CreateWsspAssertion(assertionName);
  923. result.AppendChild(policy);
  924. }
  925. return result;
  926. }
  927. public virtual bool TryImportWsspSupportingTokensAssertion(MetadataImporter importer, PolicyConversionContext policyContext, ICollection<XmlElement> assertions, Collection<SecurityTokenParameters> signed, Collection<SecurityTokenParameters> signedEncrypted, Collection<SecurityTokenParameters> endorsing, Collection<SecurityTokenParameters> signedEndorsing, Collection<SecurityTokenParameters> optionalSigned, Collection<SecurityTokenParameters> optionalSignedEncrypted, Collection<SecurityTokenParameters> optionalEndorsing, Collection<SecurityTokenParameters> optionalSignedEndorsing)
  928. {
  929. XmlElement assertion;
  930. if (!TryImportWsspSignedSupportingTokensAssertion(
  931. importer,
  932. policyContext,
  933. assertions,
  934. signed,
  935. signedEncrypted,
  936. optionalSigned,
  937. optionalSignedEncrypted,
  938. out assertion)
  939. && assertion != null)
  940. {
  941. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnsupportedSecurityPolicyAssertion, assertion.OuterXml)));
  942. }
  943. if (!TryImportWsspEndorsingSupportingTokensAssertion(
  944. importer,
  945. policyContext,
  946. assertions,
  947. endorsing,
  948. optionalEndorsing,
  949. out assertion)
  950. && assertion != null)
  951. {
  952. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnsupportedSecurityPolicyAssertion, assertion.OuterXml)));
  953. }
  954. if (!TryImportWsspSignedEndorsingSupportingTokensAssertion(
  955. importer,
  956. policyContext,
  957. assertions,
  958. signedEndorsing,
  959. optionalSignedEndorsing,
  960. out assertion)
  961. && assertion != null)
  962. {
  963. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnsupportedSecurityPolicyAssertion, assertion.OuterXml)));
  964. }
  965. return true;
  966. }
  967. protected bool TryImportWsspSignedSupportingTokensAssertion(MetadataImporter importer, PolicyConversionContext policyContext, ICollection<XmlElement> assertions, Collection<SecurityTokenParameters> signed, Collection<SecurityTokenParameters> signedEncrypted, Collection<SecurityTokenParameters> optionalSigned, Collection<SecurityTokenParameters> optionalSignedEncrypted, out XmlElement assertion)
  968. {
  969. if (signed == null)
  970. {
  971. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("signed");
  972. }
  973. if (signedEncrypted == null)
  974. {
  975. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("signedEncrypted");
  976. }
  977. if (optionalSigned == null)
  978. {
  979. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("optionalSigned");
  980. }
  981. if (optionalSignedEncrypted == null)
  982. {
  983. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("optionalSignedEncrypted");
  984. }
  985. bool result = true;
  986. Collection<Collection<XmlElement>> alternatives;
  987. if (TryImportWsspAssertion(assertions, SignedSupportingTokensName, out assertion)
  988. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  989. {
  990. foreach (Collection<XmlElement> alternative in alternatives)
  991. {
  992. Collection<SecurityTokenParameters> signedSupportingTokens = new Collection<SecurityTokenParameters>();
  993. Collection<SecurityTokenParameters> optionalSignedSupportingTokens = new Collection<SecurityTokenParameters>();
  994. SecurityTokenParameters parameters;
  995. bool isOptional;
  996. while (alternative.Count > 0 && TryImportTokenAssertion(importer, policyContext, alternative, out parameters, out isOptional))
  997. {
  998. if (isOptional)
  999. {
  1000. optionalSignedSupportingTokens.Add(parameters);
  1001. }
  1002. else
  1003. {
  1004. signedSupportingTokens.Add(parameters);
  1005. }
  1006. }
  1007. if (alternative.Count == 0)
  1008. {
  1009. foreach (SecurityTokenParameters p in signedSupportingTokens)
  1010. {
  1011. if (p is UserNameSecurityTokenParameters)
  1012. {
  1013. signedEncrypted.Add(p);
  1014. }
  1015. else
  1016. {
  1017. signed.Add(p);
  1018. }
  1019. }
  1020. foreach (SecurityTokenParameters p in optionalSignedSupportingTokens)
  1021. {
  1022. if (p is UserNameSecurityTokenParameters)
  1023. {
  1024. optionalSignedEncrypted.Add(p);
  1025. }
  1026. else
  1027. {
  1028. optionalSigned.Add(p);
  1029. }
  1030. }
  1031. result = true;
  1032. break;
  1033. }
  1034. else
  1035. {
  1036. result = false;
  1037. }
  1038. }
  1039. }
  1040. return result;
  1041. }
  1042. protected bool TryImportWsspEndorsingSupportingTokensAssertion(MetadataImporter importer, PolicyConversionContext policyContext, ICollection<XmlElement> assertions, Collection<SecurityTokenParameters> endorsing, Collection<SecurityTokenParameters> optionalEndorsing, out XmlElement assertion)
  1043. {
  1044. if (endorsing == null)
  1045. {
  1046. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("endorsing");
  1047. }
  1048. if (optionalEndorsing == null)
  1049. {
  1050. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("optionalEndorsing");
  1051. }
  1052. bool result = true;
  1053. Collection<Collection<XmlElement>> alternatives;
  1054. if (TryImportWsspAssertion(assertions, EndorsingSupportingTokensName, out assertion)
  1055. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  1056. {
  1057. foreach (Collection<XmlElement> alternative in alternatives)
  1058. {
  1059. MessagePartSpecification signedParts;
  1060. if (!TryImportWsspSignedPartsAssertion(alternative, out signedParts, out assertion) && assertion != null)
  1061. {
  1062. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnsupportedSecurityPolicyAssertion, assertion.OuterXml)));
  1063. }
  1064. Collection<SecurityTokenParameters> supportingTokens = new Collection<SecurityTokenParameters>();
  1065. Collection<SecurityTokenParameters> optionalSupportingTokens = new Collection<SecurityTokenParameters>();
  1066. SecurityTokenParameters parameters;
  1067. bool isOptional;
  1068. while (alternative.Count > 0 && TryImportTokenAssertion(importer, policyContext, alternative, out parameters, out isOptional))
  1069. {
  1070. if (isOptional)
  1071. {
  1072. optionalSupportingTokens.Add(parameters);
  1073. }
  1074. else
  1075. {
  1076. supportingTokens.Add(parameters);
  1077. }
  1078. }
  1079. if (alternative.Count == 0)
  1080. {
  1081. foreach (SecurityTokenParameters p in supportingTokens)
  1082. {
  1083. endorsing.Add(p);
  1084. }
  1085. foreach (SecurityTokenParameters p in optionalSupportingTokens)
  1086. {
  1087. optionalEndorsing.Add(p);
  1088. }
  1089. result = true;
  1090. break;
  1091. }
  1092. else
  1093. {
  1094. result = false;
  1095. }
  1096. }
  1097. }
  1098. return result;
  1099. }
  1100. protected bool TryImportWsspSignedEndorsingSupportingTokensAssertion(MetadataImporter importer, PolicyConversionContext policyContext, ICollection<XmlElement> assertions, Collection<SecurityTokenParameters> signedEndorsing, Collection<SecurityTokenParameters> optionalSignedEndorsing, out XmlElement assertion)
  1101. {
  1102. if (signedEndorsing == null)
  1103. {
  1104. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("signedEndorsing");
  1105. }
  1106. if (optionalSignedEndorsing == null)
  1107. {
  1108. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("optionalSignedEndorsing");
  1109. }
  1110. bool result = true;
  1111. Collection<Collection<XmlElement>> alternatives;
  1112. if (TryImportWsspAssertion(assertions, SignedEndorsingSupportingTokensName, out assertion)
  1113. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  1114. {
  1115. foreach (Collection<XmlElement> alternative in alternatives)
  1116. {
  1117. MessagePartSpecification signedParts;
  1118. if (!TryImportWsspSignedPartsAssertion(alternative, out signedParts, out assertion) && assertion != null)
  1119. {
  1120. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnsupportedSecurityPolicyAssertion, assertion.OuterXml)));
  1121. }
  1122. Collection<SecurityTokenParameters> supportingTokens = new Collection<SecurityTokenParameters>();
  1123. Collection<SecurityTokenParameters> optionalSupportingTokens = new Collection<SecurityTokenParameters>();
  1124. SecurityTokenParameters parameters;
  1125. bool isOptional;
  1126. while (alternative.Count > 0 && TryImportTokenAssertion(importer, policyContext, alternative, out parameters, out isOptional))
  1127. {
  1128. if (isOptional)
  1129. {
  1130. optionalSupportingTokens.Add(parameters);
  1131. }
  1132. else
  1133. {
  1134. supportingTokens.Add(parameters);
  1135. }
  1136. }
  1137. if (alternative.Count == 0)
  1138. {
  1139. foreach (SecurityTokenParameters p in supportingTokens)
  1140. {
  1141. signedEndorsing.Add(p);
  1142. }
  1143. foreach (SecurityTokenParameters p in optionalSupportingTokens)
  1144. {
  1145. optionalSignedEndorsing.Add(p);
  1146. }
  1147. result = true;
  1148. break;
  1149. }
  1150. else
  1151. {
  1152. result = false;
  1153. }
  1154. }
  1155. }
  1156. return result;
  1157. }
  1158. public virtual XmlElement CreateWsspEncryptSignatureAssertion(PolicyConversionContext policyContext, SecurityBindingElement binding)
  1159. {
  1160. MessageProtectionOrder protectionOrder;
  1161. if (binding is SymmetricSecurityBindingElement)
  1162. {
  1163. protectionOrder = ((SymmetricSecurityBindingElement)binding).MessageProtectionOrder;
  1164. }
  1165. else
  1166. {
  1167. protectionOrder = ((AsymmetricSecurityBindingElement)binding).MessageProtectionOrder;
  1168. }
  1169. if (protectionOrder == MessageProtectionOrder.SignBeforeEncryptAndEncryptSignature
  1170. && ContainsEncryptionParts(policyContext, binding))
  1171. {
  1172. return CreateWsspAssertion(EncryptSignatureName);
  1173. }
  1174. else
  1175. {
  1176. return null;
  1177. }
  1178. }
  1179. // This api checks whether or not the message will or may contain Encrypted parts
  1180. // to decide whether or not to emit sp:EncryptSignature on Binding assertion.
  1181. // 1) (Optional)EndpointSupporting.
  1182. // 2) (Optional)OperationSupporting.
  1183. // 3) In/Out/Fault Message ProtectionLevel for each Operation.
  1184. bool ContainsEncryptionParts(PolicyConversionContext policyContext, SecurityBindingElement security)
  1185. {
  1186. // special case for RST/RSTR since we hard coded the security for them
  1187. if (policyContext.Contract == NullContract)
  1188. return true;
  1189. if (security.EndpointSupportingTokenParameters.SignedEncrypted.Count > 0 ||
  1190. security.OptionalEndpointSupportingTokenParameters.SignedEncrypted.Count > 0)
  1191. {
  1192. return true;
  1193. }
  1194. foreach (SupportingTokenParameters r in security.OperationSupportingTokenParameters.Values)
  1195. {
  1196. if (r.SignedEncrypted.Count > 0)
  1197. {
  1198. return true;
  1199. }
  1200. }
  1201. foreach (SupportingTokenParameters r in security.OptionalOperationSupportingTokenParameters.Values)
  1202. {
  1203. if (r.SignedEncrypted.Count > 0)
  1204. {
  1205. return true;
  1206. }
  1207. }
  1208. BindingParameterCollection bindingParameters = new BindingParameterCollection();
  1209. bindingParameters.Add(ChannelProtectionRequirements.CreateFromContract(policyContext.Contract, policyContext.BindingElements.Find<SecurityBindingElement>().GetIndividualProperty<ISecurityCapabilities>(), false));
  1210. ChannelProtectionRequirements protectionRequirements = SecurityBindingElement.ComputeProtectionRequirements(security, bindingParameters, policyContext.BindingElements, true);
  1211. protectionRequirements.MakeReadOnly();
  1212. WSSecurityPolicy sp = WSSecurityPolicy.GetSecurityPolicyDriver(security.MessageSecurityVersion);
  1213. foreach (OperationDescription operation in policyContext.Contract.Operations)
  1214. {
  1215. // export policy for application messages
  1216. foreach (MessageDescription message in operation.Messages)
  1217. {
  1218. MessagePartSpecification parts;
  1219. ScopedMessagePartSpecification scopedParts;
  1220. // confidentiality
  1221. if (message.Direction == MessageDirection.Input)
  1222. {
  1223. scopedParts = protectionRequirements.IncomingEncryptionParts;
  1224. }
  1225. else
  1226. {
  1227. scopedParts = protectionRequirements.OutgoingEncryptionParts;
  1228. }
  1229. if (scopedParts.TryGetParts(message.Action, out parts))
  1230. {
  1231. if (!parts.IsEmpty())
  1232. {
  1233. return true;
  1234. }
  1235. }
  1236. }
  1237. // export policy for faults
  1238. foreach (FaultDescription fault in operation.Faults)
  1239. {
  1240. MessagePartSpecification parts;
  1241. // confidentiality
  1242. if (protectionRequirements.OutgoingEncryptionParts.TryGetParts(fault.Action, out parts))
  1243. {
  1244. if (!parts.IsEmpty())
  1245. {
  1246. return true;
  1247. }
  1248. }
  1249. }
  1250. }
  1251. return false;
  1252. }
  1253. public virtual XmlElement CreateWsspEncryptBeforeSigningAssertion(MessageProtectionOrder protectionOrder)
  1254. {
  1255. if (protectionOrder == MessageProtectionOrder.EncryptBeforeSign)
  1256. {
  1257. return CreateWsspAssertion(EncryptBeforeSigningName);
  1258. }
  1259. else
  1260. {
  1261. return null;
  1262. }
  1263. }
  1264. public virtual XmlElement CreateWsspProtectTokensAssertion(SecurityBindingElement sbe)
  1265. {
  1266. if (sbe.ProtectTokens)
  1267. {
  1268. return CreateWsspAssertion(ProtectTokens);
  1269. }
  1270. else
  1271. {
  1272. return null;
  1273. }
  1274. }
  1275. public virtual bool TryImportMessageProtectionOrderAssertions(ICollection<XmlElement> assertions, out MessageProtectionOrder order)
  1276. {
  1277. if (TryImportWsspAssertion(assertions, EncryptBeforeSigningName))
  1278. {
  1279. order = MessageProtectionOrder.EncryptBeforeSign;
  1280. }
  1281. else if (TryImportWsspAssertion(assertions, EncryptSignatureName))
  1282. {
  1283. order = MessageProtectionOrder.SignBeforeEncryptAndEncryptSignature;
  1284. }
  1285. else
  1286. {
  1287. order = MessageProtectionOrder.SignBeforeEncrypt;
  1288. }
  1289. return true;
  1290. }
  1291. public virtual XmlElement CreateWsspIncludeTimestampAssertion(bool includeTimestamp)
  1292. {
  1293. if (includeTimestamp)
  1294. {
  1295. return CreateWsspAssertion(IncludeTimestampName);
  1296. }
  1297. else
  1298. {
  1299. return null;
  1300. }
  1301. }
  1302. public virtual bool TryImportWsspIncludeTimestampAssertion(ICollection<XmlElement> assertions, SecurityBindingElement binding)
  1303. {
  1304. binding.IncludeTimestamp = TryImportWsspAssertion(assertions, IncludeTimestampName);
  1305. return true;
  1306. }
  1307. public virtual bool TryImportWsspProtectTokensAssertion(ICollection<XmlElement> assertions, out bool protectTokens)
  1308. {
  1309. if (TryImportWsspAssertion(assertions, ProtectTokens))
  1310. {
  1311. protectTokens = true;
  1312. }
  1313. else
  1314. {
  1315. protectTokens = false;
  1316. }
  1317. return true;
  1318. }
  1319. public virtual XmlElement CreateWsspLayoutAssertion(MetadataExporter exporter, SecurityHeaderLayout layout)
  1320. {
  1321. XmlElement result = CreateWsspAssertion(LayoutName);
  1322. result.AppendChild(
  1323. CreateWspPolicyWrapper(
  1324. exporter,
  1325. CreateLayoutAssertion(layout)
  1326. ));
  1327. return result;
  1328. }
  1329. public virtual bool TryImportWsspLayoutAssertion(MetadataImporter importer, ICollection<XmlElement> assertions, SecurityBindingElement binding)
  1330. {
  1331. bool result = false;
  1332. XmlElement assertion;
  1333. if (TryImportWsspAssertion(assertions, LayoutName, out assertion))
  1334. {
  1335. SecurityHeaderLayout layout;
  1336. Collection<Collection<XmlElement>> alternatives;
  1337. if (TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  1338. {
  1339. foreach (Collection<XmlElement> alternative in alternatives)
  1340. {
  1341. if (TryImportLayoutAssertion(alternative, out layout)
  1342. && alternative.Count == 0)
  1343. {
  1344. binding.SecurityHeaderLayout = layout;
  1345. result = true;
  1346. break;
  1347. }
  1348. }
  1349. }
  1350. }
  1351. else
  1352. {
  1353. binding.SecurityHeaderLayout = SecurityHeaderLayout.Lax;
  1354. result = true;
  1355. }
  1356. return result;
  1357. }
  1358. public virtual XmlElement CreateLayoutAssertion(SecurityHeaderLayout layout)
  1359. {
  1360. switch (layout)
  1361. {
  1362. default:
  1363. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("layout"));
  1364. case SecurityHeaderLayout.Lax:
  1365. return CreateWsspAssertion(LaxName);
  1366. case SecurityHeaderLayout.LaxTimestampFirst:
  1367. return CreateWsspAssertion(LaxTsFirstName);
  1368. case SecurityHeaderLayout.LaxTimestampLast:
  1369. return CreateWsspAssertion(LaxTsLastName);
  1370. case SecurityHeaderLayout.Strict:
  1371. return CreateWsspAssertion(StrictName);
  1372. }
  1373. }
  1374. public virtual bool TryImportLayoutAssertion(ICollection<XmlElement> assertions, out SecurityHeaderLayout layout)
  1375. {
  1376. bool result = true;
  1377. layout = SecurityHeaderLayout.Lax;
  1378. if (TryImportWsspAssertion(assertions, LaxName))
  1379. {
  1380. layout = SecurityHeaderLayout.Lax;
  1381. }
  1382. else if (TryImportWsspAssertion(assertions, LaxTsFirstName))
  1383. {
  1384. layout = SecurityHeaderLayout.LaxTimestampFirst;
  1385. }
  1386. else if (TryImportWsspAssertion(assertions, LaxTsLastName))
  1387. {
  1388. layout = SecurityHeaderLayout.LaxTimestampLast;
  1389. }
  1390. else if (TryImportWsspAssertion(assertions, StrictName))
  1391. {
  1392. layout = SecurityHeaderLayout.Strict;
  1393. }
  1394. else
  1395. {
  1396. result = false;
  1397. }
  1398. return result;
  1399. }
  1400. public virtual XmlElement CreateWsspAlgorithmSuiteAssertion(MetadataExporter exporter, SecurityAlgorithmSuite suite)
  1401. {
  1402. XmlElement result = CreateWsspAssertion(AlgorithmSuiteName);
  1403. result.AppendChild(
  1404. CreateWspPolicyWrapper(
  1405. exporter,
  1406. CreateAlgorithmSuiteAssertion(suite)
  1407. ));
  1408. return result;
  1409. }
  1410. public virtual bool TryImportWsspAlgorithmSuiteAssertion(MetadataImporter importer, ICollection<XmlElement> assertions, SecurityBindingElement binding)
  1411. {
  1412. SecurityAlgorithmSuite suite = null;
  1413. XmlElement assertion;
  1414. Collection<Collection<XmlElement>> alternatives;
  1415. if (TryImportWsspAssertion(assertions, AlgorithmSuiteName, out assertion)
  1416. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  1417. {
  1418. foreach (Collection<XmlElement> alternative in alternatives)
  1419. {
  1420. if (TryImportAlgorithmSuiteAssertion(alternative, out suite)
  1421. && alternative.Count == 0)
  1422. {
  1423. binding.DefaultAlgorithmSuite = suite;
  1424. break;
  1425. }
  1426. else
  1427. {
  1428. suite = null;
  1429. }
  1430. }
  1431. }
  1432. return suite != null;
  1433. }
  1434. public virtual XmlElement CreateAlgorithmSuiteAssertion(SecurityAlgorithmSuite suite)
  1435. {
  1436. if (suite == null)
  1437. {
  1438. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("suite");
  1439. }
  1440. XmlElement result;
  1441. if (suite == SecurityAlgorithmSuite.Basic256)
  1442. result = CreateWsspAssertion(Basic256Name);
  1443. else if (suite == SecurityAlgorithmSuite.Basic192)
  1444. result = CreateWsspAssertion(Basic192Name);
  1445. else if (suite == SecurityAlgorithmSuite.Basic128)
  1446. result = CreateWsspAssertion(Basic128Name);
  1447. else if (suite == SecurityAlgorithmSuite.TripleDes)
  1448. result = CreateWsspAssertion(TripleDesName);
  1449. else if (suite == SecurityAlgorithmSuite.Basic256Rsa15)
  1450. result = CreateWsspAssertion(Basic256Rsa15Name);
  1451. else if (suite == SecurityAlgorithmSuite.Basic192Rsa15)
  1452. result = CreateWsspAssertion(Basic192Rsa15Name);
  1453. else if (suite == SecurityAlgorithmSuite.Basic128Rsa15)
  1454. result = CreateWsspAssertion(Basic128Rsa15Name);
  1455. else if (suite == SecurityAlgorithmSuite.TripleDesRsa15)
  1456. result = CreateWsspAssertion(TripleDesRsa15Name);
  1457. else if (suite == SecurityAlgorithmSuite.Basic256Sha256)
  1458. result = CreateWsspAssertion(Basic256Sha256Name);
  1459. else if (suite == SecurityAlgorithmSuite.Basic192Sha256)
  1460. result = CreateWsspAssertion(Basic192Sha256Name);
  1461. else if (suite == SecurityAlgorithmSuite.Basic128Sha256)
  1462. result = CreateWsspAssertion(Basic128Sha256Name);
  1463. else if (suite == SecurityAlgorithmSuite.TripleDesSha256)
  1464. result = CreateWsspAssertion(TripleDesSha256Name);
  1465. else if (suite == SecurityAlgorithmSuite.Basic256Sha256Rsa15)
  1466. result = CreateWsspAssertion(Basic256Sha256Rsa15Name);
  1467. else if (suite == SecurityAlgorithmSuite.Basic192Sha256Rsa15)
  1468. result = CreateWsspAssertion(Basic192Sha256Rsa15Name);
  1469. else if (suite == SecurityAlgorithmSuite.Basic128Sha256Rsa15)
  1470. result = CreateWsspAssertion(Basic128Sha256Rsa15Name);
  1471. else if (suite == SecurityAlgorithmSuite.TripleDesSha256Rsa15)
  1472. result = CreateWsspAssertion(TripleDesSha256Rsa15Name);
  1473. else
  1474. {
  1475. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("suite"));
  1476. }
  1477. return result;
  1478. }
  1479. public virtual bool TryImportAlgorithmSuiteAssertion(ICollection<XmlElement> assertions, out SecurityAlgorithmSuite suite)
  1480. {
  1481. if (TryImportWsspAssertion(assertions, Basic256Name))
  1482. suite = SecurityAlgorithmSuite.Basic256;
  1483. else if (TryImportWsspAssertion(assertions, Basic192Name))
  1484. suite = SecurityAlgorithmSuite.Basic192;
  1485. else if (TryImportWsspAssertion(assertions, Basic128Name))
  1486. suite = SecurityAlgorithmSuite.Basic128;
  1487. else if (TryImportWsspAssertion(assertions, TripleDesName))
  1488. suite = SecurityAlgorithmSuite.TripleDes;
  1489. else if (TryImportWsspAssertion(assertions, Basic256Rsa15Name))
  1490. suite = SecurityAlgorithmSuite.Basic256Rsa15;
  1491. else if (TryImportWsspAssertion(assertions, Basic192Rsa15Name))
  1492. suite = SecurityAlgorithmSuite.Basic192Rsa15;
  1493. else if (TryImportWsspAssertion(assertions, Basic128Rsa15Name))
  1494. suite = SecurityAlgorithmSuite.Basic128Rsa15;
  1495. else if (TryImportWsspAssertion(assertions, TripleDesRsa15Name))
  1496. suite = SecurityAlgorithmSuite.TripleDesRsa15;
  1497. else if (TryImportWsspAssertion(assertions, Basic256Sha256Name))
  1498. suite = SecurityAlgorithmSuite.Basic256Sha256;
  1499. else if (TryImportWsspAssertion(assertions, Basic192Sha256Name))
  1500. suite = SecurityAlgorithmSuite.Basic192Sha256;
  1501. else if (TryImportWsspAssertion(assertions, Basic128Sha256Name))
  1502. suite = SecurityAlgorithmSuite.Basic128Sha256;
  1503. else if (TryImportWsspAssertion(assertions, TripleDesSha256Name))
  1504. suite = SecurityAlgorithmSuite.TripleDesSha256;
  1505. else if (TryImportWsspAssertion(assertions, Basic256Sha256Rsa15Name))
  1506. suite = SecurityAlgorithmSuite.Basic256Sha256Rsa15;
  1507. else if (TryImportWsspAssertion(assertions, Basic192Sha256Rsa15Name))
  1508. suite = SecurityAlgorithmSuite.Basic192Sha256Rsa15;
  1509. else if (TryImportWsspAssertion(assertions, Basic128Sha256Rsa15Name))
  1510. suite = SecurityAlgorithmSuite.Basic128Sha256Rsa15;
  1511. else if (TryImportWsspAssertion(assertions, TripleDesSha256Rsa15Name))
  1512. suite = SecurityAlgorithmSuite.TripleDesSha256Rsa15;
  1513. else
  1514. suite = null;
  1515. return suite != null;
  1516. }
  1517. public virtual XmlElement CreateWsspProtectionTokenAssertion(MetadataExporter exporter, SecurityTokenParameters parameters)
  1518. {
  1519. XmlElement result = CreateWsspAssertion(ProtectionTokenName);
  1520. result.AppendChild(
  1521. CreateWspPolicyWrapper(
  1522. exporter,
  1523. CreateTokenAssertion(exporter, parameters)
  1524. ));
  1525. _protectionTokenHasAsymmetricKey = parameters.HasAsymmetricKey;
  1526. return result;
  1527. }
  1528. public virtual bool TryImportWsspProtectionTokenAssertion(MetadataImporter importer, PolicyConversionContext policyContext, ICollection<XmlElement> assertions, SymmetricSecurityBindingElement binding)
  1529. {
  1530. bool result = false;
  1531. XmlElement assertion;
  1532. Collection<Collection<XmlElement>> alternatives;
  1533. if (TryImportWsspAssertion(assertions, ProtectionTokenName, out assertion)
  1534. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  1535. {
  1536. foreach (Collection<XmlElement> alternative in alternatives)
  1537. {
  1538. SecurityTokenParameters tokenParameters;
  1539. bool isOptional;
  1540. if (TryImportTokenAssertion(importer, policyContext, alternative, out tokenParameters, out isOptional)
  1541. && alternative.Count == 0)
  1542. {
  1543. result = true;
  1544. binding.ProtectionTokenParameters = tokenParameters;
  1545. break;
  1546. }
  1547. }
  1548. }
  1549. return result;
  1550. }
  1551. public virtual bool TryImportWsspInitiatorTokenAssertion(MetadataImporter importer, PolicyConversionContext policyContext, ICollection<XmlElement> assertions, AsymmetricSecurityBindingElement binding)
  1552. {
  1553. bool result = false;
  1554. XmlElement assertion;
  1555. Collection<Collection<XmlElement>> alternatives;
  1556. if (TryImportWsspAssertion(assertions, InitiatorTokenName, out assertion)
  1557. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  1558. {
  1559. foreach (Collection<XmlElement> alternative in alternatives)
  1560. {
  1561. SecurityTokenParameters tokenParameters;
  1562. bool isOptional;
  1563. if (TryImportTokenAssertion(importer, policyContext, alternative, out tokenParameters, out isOptional)
  1564. && alternative.Count == 0)
  1565. {
  1566. result = true;
  1567. binding.InitiatorTokenParameters = tokenParameters;
  1568. break;
  1569. }
  1570. }
  1571. }
  1572. return result;
  1573. }
  1574. public virtual bool TryImportWsspRecipientTokenAssertion(MetadataImporter importer, PolicyConversionContext policyContext, ICollection<XmlElement> assertions, AsymmetricSecurityBindingElement binding)
  1575. {
  1576. bool result = false;
  1577. XmlElement assertion;
  1578. Collection<Collection<XmlElement>> alternatives;
  1579. if (TryImportWsspAssertion(assertions, RecipientTokenName, out assertion)
  1580. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  1581. {
  1582. foreach (Collection<XmlElement> alternative in alternatives)
  1583. {
  1584. SecurityTokenParameters tokenParameters;
  1585. bool isOptional;
  1586. if (TryImportTokenAssertion(importer, policyContext, alternative, out tokenParameters, out isOptional)
  1587. && alternative.Count == 0)
  1588. {
  1589. result = true;
  1590. binding.RecipientTokenParameters = tokenParameters;
  1591. break;
  1592. }
  1593. }
  1594. }
  1595. return result;
  1596. }
  1597. public virtual XmlElement CreateWsspInitiatorTokenAssertion(MetadataExporter exporter, SecurityTokenParameters parameters)
  1598. {
  1599. XmlElement result = CreateWsspAssertion(InitiatorTokenName);
  1600. result.AppendChild(
  1601. CreateWspPolicyWrapper(
  1602. exporter,
  1603. CreateTokenAssertion(exporter, parameters)
  1604. ));
  1605. return result;
  1606. }
  1607. public virtual XmlElement CreateWsspRecipientTokenAssertion(MetadataExporter exporter, SecurityTokenParameters parameters)
  1608. {
  1609. XmlElement result = CreateWsspAssertion(RecipientTokenName);
  1610. result.AppendChild(
  1611. CreateWspPolicyWrapper(
  1612. exporter,
  1613. CreateTokenAssertion(exporter, parameters)
  1614. ));
  1615. return result;
  1616. }
  1617. public virtual XmlElement CreateWsspTransportTokenAssertion(MetadataExporter exporter, XmlElement transportTokenAssertion)
  1618. {
  1619. if (transportTokenAssertion == null)
  1620. {
  1621. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("transportTokenAssertion");
  1622. }
  1623. XmlElement result = CreateWsspAssertion(TransportTokenName);
  1624. result.AppendChild(
  1625. CreateWspPolicyWrapper(
  1626. exporter,
  1627. (XmlElement)(doc.ImportNode(transportTokenAssertion, true))
  1628. ));
  1629. return result;
  1630. }
  1631. public virtual bool TryImportWsspTransportTokenAssertion(MetadataImporter importer, ICollection<XmlElement> assertions, out XmlElement transportBindingAssertion)
  1632. {
  1633. transportBindingAssertion = null;
  1634. XmlElement assertion;
  1635. Collection<Collection<XmlElement>> alternatives;
  1636. if (TryImportWsspAssertion(assertions, TransportTokenName, out assertion)
  1637. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives)
  1638. && alternatives.Count == 1
  1639. && alternatives[0].Count == 1)
  1640. {
  1641. // we cannot process choices of transport tokens due to the current contract between
  1642. // security and transport binding element converters
  1643. transportBindingAssertion = alternatives[0][0];
  1644. }
  1645. return transportBindingAssertion != null;
  1646. }
  1647. public virtual XmlElement CreateTokenAssertion(MetadataExporter exporter, SecurityTokenParameters parameters)
  1648. {
  1649. return CreateTokenAssertion(exporter, parameters, false);
  1650. }
  1651. public virtual XmlElement CreateTokenAssertion(MetadataExporter exporter, SecurityTokenParameters parameters, bool isOptional)
  1652. {
  1653. if (parameters == null)
  1654. {
  1655. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("parameters");
  1656. }
  1657. XmlElement result;
  1658. if (parameters is KerberosSecurityTokenParameters)
  1659. {
  1660. result = CreateWsspKerberosTokenAssertion(exporter, (KerberosSecurityTokenParameters)parameters);
  1661. }
  1662. else if (parameters is X509SecurityTokenParameters)
  1663. {
  1664. result = CreateWsspX509TokenAssertion(exporter, (X509SecurityTokenParameters)parameters);
  1665. }
  1666. else if (parameters is UserNameSecurityTokenParameters)
  1667. {
  1668. result = CreateWsspUsernameTokenAssertion(exporter, (UserNameSecurityTokenParameters)parameters);
  1669. }
  1670. else if (parameters is IssuedSecurityTokenParameters)
  1671. {
  1672. result = CreateWsspIssuedTokenAssertion(exporter, (IssuedSecurityTokenParameters)parameters);
  1673. }
  1674. else if (parameters is SspiSecurityTokenParameters)
  1675. {
  1676. result = CreateWsspSpnegoContextTokenAssertion(exporter, (SspiSecurityTokenParameters)parameters);
  1677. }
  1678. else if (parameters is SslSecurityTokenParameters)
  1679. {
  1680. result = CreateMsspSslContextTokenAssertion(exporter, (SslSecurityTokenParameters)parameters);
  1681. }
  1682. else if (parameters is SecureConversationSecurityTokenParameters)
  1683. {
  1684. result = CreateWsspSecureConversationTokenAssertion(exporter, (SecureConversationSecurityTokenParameters)parameters);
  1685. }
  1686. else if (parameters is RsaSecurityTokenParameters)
  1687. {
  1688. result = CreateWsspRsaTokenAssertion((RsaSecurityTokenParameters)parameters);
  1689. }
  1690. else
  1691. {
  1692. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("parameters"));
  1693. }
  1694. if (result != null && isOptional)
  1695. {
  1696. result.SetAttribute(OptionalName, exporter.PolicyVersion.Namespace, TrueName);
  1697. }
  1698. return result;
  1699. }
  1700. public virtual bool TryImportTokenAssertion(MetadataImporter importer, PolicyConversionContext policyContext, Collection<XmlElement> assertions, out SecurityTokenParameters parameters, out bool isOptional)
  1701. {
  1702. parameters = null;
  1703. isOptional = false;
  1704. if (assertions.Count >= 1)
  1705. {
  1706. XmlElement tokenAssertion = assertions[0];
  1707. if (TryImportWsspKerberosTokenAssertion(importer, tokenAssertion, out parameters)
  1708. || TryImportWsspX509TokenAssertion(importer, tokenAssertion, out parameters)
  1709. || TryImportWsspUsernameTokenAssertion(importer, tokenAssertion, out parameters)
  1710. || TryImportWsspIssuedTokenAssertion(importer, policyContext, tokenAssertion, out parameters)
  1711. || TryImportWsspSpnegoContextTokenAssertion(importer, tokenAssertion, out parameters)
  1712. || TryImportMsspSslContextTokenAssertion(importer, tokenAssertion, out parameters)
  1713. || TryImportWsspSecureConversationTokenAssertion(importer, tokenAssertion, out parameters)
  1714. || TryImportWsspRsaTokenAssertion(importer, tokenAssertion, out parameters))
  1715. {
  1716. string optionalAttribute = tokenAssertion.GetAttribute(OptionalName, WspNamespace);
  1717. if (String.IsNullOrEmpty(optionalAttribute))
  1718. {
  1719. optionalAttribute = tokenAssertion.GetAttribute(OptionalName, Wsp15Namespace);
  1720. }
  1721. try
  1722. {
  1723. isOptional = XmlUtil.IsTrue(optionalAttribute);
  1724. }
  1725. catch ( Exception e )
  1726. {
  1727. if (Fx.IsFatal(e))
  1728. throw;
  1729. if (e is NullReferenceException)
  1730. throw;
  1731. importer.Errors.Add(new MetadataConversionError(SR.GetString(SR.UnsupportedBooleanAttribute, OptionalName, e.Message), false));
  1732. return false;
  1733. }
  1734. assertions.RemoveAt(0);
  1735. }
  1736. }
  1737. return (parameters != null);
  1738. }
  1739. public virtual void SetIncludeTokenValue(XmlElement tokenAssertion, SecurityTokenInclusionMode inclusionMode)
  1740. {
  1741. switch (inclusionMode)
  1742. {
  1743. default:
  1744. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("inclusionMode"));
  1745. case SecurityTokenInclusionMode.AlwaysToInitiator:
  1746. tokenAssertion.SetAttribute(IncludeTokenName, this.WsspNamespaceUri, AlwaysToInitiatorUri);
  1747. break;
  1748. case SecurityTokenInclusionMode.AlwaysToRecipient:
  1749. tokenAssertion.SetAttribute(IncludeTokenName, this.WsspNamespaceUri, AlwaysToRecipientUri);
  1750. break;
  1751. case SecurityTokenInclusionMode.Never:
  1752. tokenAssertion.SetAttribute(IncludeTokenName, this.WsspNamespaceUri, NeverUri);
  1753. break;
  1754. case SecurityTokenInclusionMode.Once:
  1755. tokenAssertion.SetAttribute(IncludeTokenName, this.WsspNamespaceUri, OnceUri);
  1756. break;
  1757. }
  1758. }
  1759. public virtual bool TryGetIncludeTokenValue(XmlElement assertion, out SecurityTokenInclusionMode mode)
  1760. {
  1761. string includeTokenUri = assertion.GetAttribute(IncludeTokenName, this.WsspNamespaceUri);
  1762. if (includeTokenUri == AlwaysToInitiatorUri)
  1763. {
  1764. mode = SecurityTokenInclusionMode.AlwaysToInitiator;
  1765. return true;
  1766. }
  1767. else if (includeTokenUri == AlwaysToRecipientUri)
  1768. {
  1769. mode = SecurityTokenInclusionMode.AlwaysToRecipient;
  1770. return true;
  1771. }
  1772. else if (includeTokenUri == NeverUri)
  1773. {
  1774. mode = SecurityTokenInclusionMode.Never;
  1775. return true;
  1776. }
  1777. else if (includeTokenUri == OnceUri)
  1778. {
  1779. mode = SecurityTokenInclusionMode.Once;
  1780. return true;
  1781. }
  1782. else
  1783. {
  1784. mode = SecurityTokenInclusionMode.Never;
  1785. return false;
  1786. }
  1787. }
  1788. public virtual XmlElement CreateWsspRequireDerivedKeysAssertion(bool requireDerivedKeys)
  1789. {
  1790. if (requireDerivedKeys)
  1791. {
  1792. return CreateWsspAssertion(RequireDerivedKeysName);
  1793. }
  1794. else
  1795. {
  1796. return null;
  1797. }
  1798. }
  1799. public virtual bool TryImportWsspRequireDerivedKeysAssertion(ICollection<XmlElement> assertions, SecurityTokenParameters parameters)
  1800. {
  1801. parameters.RequireDerivedKeys = TryImportWsspAssertion(assertions, RequireDerivedKeysName);
  1802. return true;
  1803. }
  1804. public virtual XmlElement CreateWsspKerberosTokenAssertion(MetadataExporter exporter, KerberosSecurityTokenParameters parameters)
  1805. {
  1806. XmlElement result = CreateWsspAssertion(KerberosTokenName);
  1807. SetIncludeTokenValue(result, parameters.InclusionMode);
  1808. result.AppendChild(
  1809. CreateWspPolicyWrapper(
  1810. exporter,
  1811. CreateWsspRequireDerivedKeysAssertion(parameters.RequireDerivedKeys),
  1812. CreateWsspAssertion(WssGssKerberosV5ApReqToken11Name)
  1813. ));
  1814. return result;
  1815. }
  1816. public virtual bool TryImportWsspKerberosTokenAssertion(MetadataImporter importer, XmlElement assertion, out SecurityTokenParameters parameters)
  1817. {
  1818. parameters = null;
  1819. SecurityTokenInclusionMode inclusionMode;
  1820. Collection<Collection<XmlElement>> alternatives;
  1821. if (IsWsspAssertion(assertion, KerberosTokenName)
  1822. && TryGetIncludeTokenValue(assertion, out inclusionMode))
  1823. {
  1824. if (TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  1825. {
  1826. foreach (Collection<XmlElement> alternative in alternatives)
  1827. {
  1828. parameters = new KerberosSecurityTokenParameters();
  1829. if (TryImportWsspRequireDerivedKeysAssertion(alternative, parameters)
  1830. && TryImportWsspAssertion(alternative, WssGssKerberosV5ApReqToken11Name, true)
  1831. && alternative.Count == 0)
  1832. {
  1833. parameters.InclusionMode = inclusionMode;
  1834. break;
  1835. }
  1836. else
  1837. {
  1838. parameters = null;
  1839. }
  1840. }
  1841. }
  1842. else
  1843. {
  1844. parameters = new KerberosSecurityTokenParameters();
  1845. parameters.RequireDerivedKeys = false;
  1846. parameters.InclusionMode = inclusionMode;
  1847. }
  1848. }
  1849. return parameters != null;
  1850. }
  1851. public virtual XmlElement CreateX509ReferenceStyleAssertion(X509KeyIdentifierClauseType referenceStyle)
  1852. {
  1853. switch (referenceStyle)
  1854. {
  1855. default:
  1856. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("referenceStyle"));
  1857. case X509KeyIdentifierClauseType.IssuerSerial:
  1858. _mustSupportRefIssuerSerialName = true;
  1859. return CreateWsspAssertion(RequireIssuerSerialReferenceName);
  1860. case X509KeyIdentifierClauseType.SubjectKeyIdentifier:
  1861. _mustSupportRefKeyIdentifierName = true;
  1862. return CreateWsspAssertion(RequireKeyIdentifierReferenceName);
  1863. case X509KeyIdentifierClauseType.Thumbprint:
  1864. _mustSupportRefThumbprintName = true;
  1865. return CreateWsspAssertion(RequireThumbprintReferenceName);
  1866. case X509KeyIdentifierClauseType.Any:
  1867. _mustSupportRefIssuerSerialName = true;
  1868. _mustSupportRefKeyIdentifierName = true;
  1869. _mustSupportRefThumbprintName = true;
  1870. return null;
  1871. }
  1872. }
  1873. public virtual bool TryImportX509ReferenceStyleAssertion(ICollection<XmlElement> assertions, X509SecurityTokenParameters parameters)
  1874. {
  1875. if (TryImportWsspAssertion(assertions, RequireIssuerSerialReferenceName))
  1876. {
  1877. parameters.X509ReferenceStyle = X509KeyIdentifierClauseType.IssuerSerial;
  1878. }
  1879. else if (TryImportWsspAssertion(assertions, RequireKeyIdentifierReferenceName))
  1880. {
  1881. parameters.X509ReferenceStyle = X509KeyIdentifierClauseType.SubjectKeyIdentifier;
  1882. }
  1883. else if (TryImportWsspAssertion(assertions, RequireThumbprintReferenceName))
  1884. {
  1885. parameters.X509ReferenceStyle = X509KeyIdentifierClauseType.Thumbprint;
  1886. }
  1887. return true;
  1888. }
  1889. public virtual XmlElement CreateWsspX509TokenAssertion(MetadataExporter exporter, X509SecurityTokenParameters parameters)
  1890. {
  1891. XmlElement result = CreateWsspAssertion(X509TokenName);
  1892. SetIncludeTokenValue(result, parameters.InclusionMode);
  1893. result.AppendChild(
  1894. CreateWspPolicyWrapper(
  1895. exporter,
  1896. CreateWsspRequireDerivedKeysAssertion(parameters.RequireDerivedKeys),
  1897. CreateX509ReferenceStyleAssertion(parameters.X509ReferenceStyle),
  1898. CreateWsspAssertion(WssX509V3Token10Name)
  1899. ));
  1900. return result;
  1901. }
  1902. public virtual bool TryImportWsspX509TokenAssertion(MetadataImporter importer, XmlElement assertion, out SecurityTokenParameters parameters)
  1903. {
  1904. parameters = null;
  1905. SecurityTokenInclusionMode inclusionMode;
  1906. Collection<Collection<XmlElement>> alternatives;
  1907. if (IsWsspAssertion(assertion, X509TokenName)
  1908. && TryGetIncludeTokenValue(assertion, out inclusionMode))
  1909. {
  1910. if (TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  1911. {
  1912. foreach (Collection<XmlElement> alternative in alternatives)
  1913. {
  1914. X509SecurityTokenParameters x509 = new X509SecurityTokenParameters();
  1915. parameters = x509;
  1916. if (TryImportWsspRequireDerivedKeysAssertion(alternative, x509)
  1917. && TryImportX509ReferenceStyleAssertion(alternative, x509)
  1918. && TryImportWsspAssertion(alternative, WssX509V3Token10Name, true)
  1919. && alternative.Count == 0)
  1920. {
  1921. parameters.InclusionMode = inclusionMode;
  1922. break;
  1923. }
  1924. else
  1925. {
  1926. parameters = null;
  1927. }
  1928. }
  1929. }
  1930. else
  1931. {
  1932. parameters = new X509SecurityTokenParameters();
  1933. parameters.RequireDerivedKeys = false;
  1934. parameters.InclusionMode = inclusionMode;
  1935. }
  1936. }
  1937. return parameters != null;
  1938. }
  1939. public virtual XmlElement CreateWsspUsernameTokenAssertion(MetadataExporter exporter, UserNameSecurityTokenParameters parameters)
  1940. {
  1941. XmlElement result = CreateWsspAssertion(UsernameTokenName);
  1942. SetIncludeTokenValue(result, parameters.InclusionMode);
  1943. result.AppendChild(
  1944. CreateWspPolicyWrapper(
  1945. exporter,
  1946. CreateWsspAssertion(WssUsernameToken10Name)
  1947. ));
  1948. return result;
  1949. }
  1950. public virtual bool TryImportWsspUsernameTokenAssertion(MetadataImporter importer, XmlElement assertion, out SecurityTokenParameters parameters)
  1951. {
  1952. parameters = null;
  1953. SecurityTokenInclusionMode inclusionMode;
  1954. Collection<Collection<XmlElement>> alternatives;
  1955. if (IsWsspAssertion(assertion, UsernameTokenName)
  1956. && TryGetIncludeTokenValue(assertion, out inclusionMode))
  1957. {
  1958. if (TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  1959. {
  1960. foreach (Collection<XmlElement> alternative in alternatives)
  1961. {
  1962. if (TryImportWsspAssertion(alternative, WssUsernameToken10Name)
  1963. && alternative.Count == 0)
  1964. {
  1965. parameters = new UserNameSecurityTokenParameters();
  1966. parameters.InclusionMode = inclusionMode;
  1967. break;
  1968. }
  1969. }
  1970. }
  1971. else
  1972. {
  1973. parameters = new UserNameSecurityTokenParameters();
  1974. parameters.InclusionMode = inclusionMode;
  1975. }
  1976. }
  1977. return parameters != null;
  1978. }
  1979. public virtual XmlElement CreateWsspRsaTokenAssertion(RsaSecurityTokenParameters parameters)
  1980. {
  1981. XmlElement result = CreateMsspAssertion(RsaTokenName);
  1982. SetIncludeTokenValue(result, parameters.InclusionMode);
  1983. return result;
  1984. }
  1985. public virtual bool TryImportWsspRsaTokenAssertion(MetadataImporter importer, XmlElement assertion, out SecurityTokenParameters parameters)
  1986. {
  1987. parameters = null;
  1988. SecurityTokenInclusionMode inclusionMode;
  1989. Collection<Collection<XmlElement>> alternatives;
  1990. if (IsMsspAssertion(assertion, RsaTokenName)
  1991. && TryGetIncludeTokenValue(assertion, out inclusionMode)
  1992. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives) == false)
  1993. {
  1994. parameters = new RsaSecurityTokenParameters();
  1995. parameters.InclusionMode = inclusionMode;
  1996. }
  1997. return parameters != null;
  1998. }
  1999. public virtual XmlElement CreateReferenceStyleAssertion(SecurityTokenReferenceStyle referenceStyle)
  2000. {
  2001. switch (referenceStyle)
  2002. {
  2003. default:
  2004. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("referenceStyle"));
  2005. case SecurityTokenReferenceStyle.External:
  2006. return CreateWsspAssertion(RequireExternalReferenceName);
  2007. case SecurityTokenReferenceStyle.Internal:
  2008. return CreateWsspAssertion(RequireInternalReferenceName);
  2009. }
  2010. }
  2011. public virtual bool TryImportReferenceStyleAssertion(ICollection<XmlElement> assertions, IssuedSecurityTokenParameters parameters)
  2012. {
  2013. if (TryImportWsspAssertion(assertions, RequireExternalReferenceName))
  2014. {
  2015. parameters.ReferenceStyle = SecurityTokenReferenceStyle.External;
  2016. }
  2017. else if (TryImportWsspAssertion(assertions, RequireInternalReferenceName))
  2018. {
  2019. parameters.ReferenceStyle = SecurityTokenReferenceStyle.Internal;
  2020. }
  2021. return true;
  2022. }
  2023. public virtual XmlElement CreateWsspIssuerElement(EndpointAddress issuerAddress, EndpointAddress issuerMetadataAddress)
  2024. {
  2025. XmlElement result;
  2026. if (issuerAddress == null && issuerMetadataAddress == null)
  2027. {
  2028. result = null;
  2029. }
  2030. else
  2031. {
  2032. EndpointAddress addressToSerialize;
  2033. addressToSerialize = issuerAddress == null ? EndpointAddress.AnonymousAddress : issuerAddress;
  2034. MemoryStream stream;
  2035. XmlWriter writer;
  2036. if (issuerMetadataAddress != null)
  2037. {
  2038. MetadataSet metadataSet = new MetadataSet();
  2039. metadataSet.MetadataSections.Add(new MetadataSection(null, null, new MetadataReference(issuerMetadataAddress, AddressingVersion.WSAddressing10)));
  2040. stream = new MemoryStream();
  2041. writer = new XmlTextWriter(stream, System.Text.Encoding.UTF8);
  2042. metadataSet.WriteTo(XmlDictionaryWriter.CreateDictionaryWriter(writer));
  2043. writer.Flush();
  2044. stream.Seek(0, SeekOrigin.Begin);
  2045. addressToSerialize = new EndpointAddress(
  2046. addressToSerialize.Uri,
  2047. addressToSerialize.Identity,
  2048. addressToSerialize.Headers,
  2049. XmlDictionaryReader.CreateDictionaryReader(XmlReader.Create(stream)),
  2050. addressToSerialize.GetReaderAtExtensions());
  2051. }
  2052. stream = new MemoryStream();
  2053. writer = new XmlTextWriter(stream, System.Text.Encoding.UTF8);
  2054. writer.WriteStartElement(IssuerName, this.WsspNamespaceUri);
  2055. addressToSerialize.WriteContentsTo(AddressingVersion.WSAddressing10, writer);
  2056. writer.WriteEndElement();
  2057. writer.Flush();
  2058. stream.Seek(0, SeekOrigin.Begin);
  2059. result = (XmlElement)doc.ReadNode(new XmlTextReader(stream));
  2060. }
  2061. return result;
  2062. }
  2063. public virtual bool TryGetIssuer(XmlElement assertion, out EndpointAddress issuer, out EndpointAddress issuerMetadata)
  2064. {
  2065. bool result = true;
  2066. issuer = null;
  2067. issuerMetadata = null;
  2068. foreach (XmlNode node in assertion.ChildNodes)
  2069. {
  2070. if (node is XmlElement && IsWsspAssertion((XmlElement)node, IssuerName))
  2071. {
  2072. try
  2073. {
  2074. issuer = EndpointAddress.ReadFrom(XmlDictionaryReader.CreateDictionaryReader(new XmlNodeReader(node)));
  2075. XmlDictionaryReader metadataReader = issuer.GetReaderAtMetadata();
  2076. if (metadataReader != null)
  2077. {
  2078. while (metadataReader.MoveToContent() == XmlNodeType.Element)
  2079. {
  2080. if (metadataReader.LocalName == MetadataStrings.MetadataExchangeStrings.Metadata
  2081. && metadataReader.NamespaceURI == MetadataStrings.MetadataExchangeStrings.Namespace)
  2082. {
  2083. MetadataSet metadataSet = MetadataSet.ReadFrom(metadataReader);
  2084. foreach (MetadataSection section in metadataSet.MetadataSections)
  2085. {
  2086. if (section.Metadata is MetadataReference)
  2087. {
  2088. issuerMetadata = ((MetadataReference)section.Metadata).Address;
  2089. }
  2090. }
  2091. break;
  2092. }
  2093. else
  2094. {
  2095. metadataReader.Skip();
  2096. }
  2097. }
  2098. }
  2099. }
  2100. catch (Exception e)
  2101. {
  2102. if (Fx.IsFatal(e))
  2103. throw;
  2104. if (e is NullReferenceException)
  2105. throw;
  2106. result = false;
  2107. }
  2108. break;
  2109. }
  2110. }
  2111. return result;
  2112. }
  2113. public virtual XmlElement CreateWsspIssuedTokenAssertion(MetadataExporter exporter, IssuedSecurityTokenParameters parameters)
  2114. {
  2115. XmlElement result = CreateWsspAssertion(IssuedTokenName);
  2116. SetIncludeTokenValue(result, parameters.InclusionMode);
  2117. XmlElement issuerAssertion = CreateWsspIssuerElement(parameters.IssuerAddress, parameters.IssuerMetadataAddress);
  2118. if (issuerAssertion != null)
  2119. {
  2120. result.AppendChild(issuerAssertion);
  2121. }
  2122. XmlElement tokenTemplate = CreateWsspAssertion(RequestSecurityTokenTemplateName);
  2123. TrustDriver driver = this.TrustDriver;
  2124. foreach (XmlElement p in parameters.CreateRequestParameters(driver))
  2125. {
  2126. tokenTemplate.AppendChild(doc.ImportNode(p, true));
  2127. }
  2128. result.AppendChild(tokenTemplate);
  2129. result.AppendChild(
  2130. CreateWspPolicyWrapper(
  2131. exporter,
  2132. CreateWsspRequireDerivedKeysAssertion(parameters.RequireDerivedKeys),
  2133. CreateReferenceStyleAssertion(parameters.ReferenceStyle)
  2134. ));
  2135. return result;
  2136. }
  2137. public virtual bool TryGetRequestSecurityTokenTemplate(XmlElement assertion, out Collection<XmlElement> requestParameters)
  2138. {
  2139. requestParameters = null;
  2140. foreach (XmlNode node in assertion.ChildNodes)
  2141. {
  2142. if (node is XmlElement && IsWsspAssertion((XmlElement)node, RequestSecurityTokenTemplateName))
  2143. {
  2144. requestParameters = new Collection<XmlElement>();
  2145. foreach (XmlNode p in node.ChildNodes)
  2146. {
  2147. if (p is XmlElement)
  2148. {
  2149. requestParameters.Add((XmlElement)p);
  2150. }
  2151. }
  2152. }
  2153. }
  2154. return requestParameters != null;
  2155. }
  2156. public virtual bool TryImportWsspIssuedTokenAssertion(MetadataImporter importer, PolicyConversionContext policyContext, XmlElement assertion, out SecurityTokenParameters parameters)
  2157. {
  2158. parameters = null;
  2159. SecurityTokenInclusionMode inclusionMode;
  2160. Collection<Collection<XmlElement>> alternatives;
  2161. EndpointAddress issuer;
  2162. EndpointAddress issuerMetadata;
  2163. Collection<XmlElement> requestSecurityTokenTemplate;
  2164. if (IsWsspAssertion(assertion, IssuedTokenName)
  2165. && TryGetIncludeTokenValue(assertion, out inclusionMode)
  2166. && TryGetIssuer(assertion, out issuer, out issuerMetadata)
  2167. && TryGetRequestSecurityTokenTemplate(assertion, out requestSecurityTokenTemplate))
  2168. {
  2169. if (TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  2170. {
  2171. foreach (Collection<XmlElement> alternative in alternatives)
  2172. {
  2173. IssuedSecurityTokenParameters issued = new IssuedSecurityTokenParameters();
  2174. parameters = issued;
  2175. if (TryImportWsspRequireDerivedKeysAssertion(alternative, issued)
  2176. && TryImportReferenceStyleAssertion(alternative, issued)
  2177. && alternative.Count == 0)
  2178. {
  2179. issued.InclusionMode = inclusionMode;
  2180. issued.IssuerAddress = issuer;
  2181. issued.IssuerMetadataAddress = issuerMetadata;
  2182. issued.SetRequestParameters(requestSecurityTokenTemplate, this.TrustDriver);
  2183. TokenIssuerPolicyResolver policyResolver = new TokenIssuerPolicyResolver(this.TrustDriver);
  2184. policyResolver.ResolveTokenIssuerPolicy(importer, policyContext, issued);
  2185. break;
  2186. }
  2187. else
  2188. {
  2189. parameters = null;
  2190. }
  2191. }
  2192. }
  2193. else
  2194. {
  2195. IssuedSecurityTokenParameters issued = new IssuedSecurityTokenParameters();
  2196. parameters = issued;
  2197. issued.InclusionMode = inclusionMode;
  2198. issued.IssuerAddress = issuer;
  2199. issued.IssuerMetadataAddress = issuerMetadata;
  2200. issued.SetRequestParameters(requestSecurityTokenTemplate, this.TrustDriver);
  2201. issued.RequireDerivedKeys = false;
  2202. }
  2203. }
  2204. return parameters != null;
  2205. }
  2206. public virtual XmlElement CreateWsspMustNotSendCancelAssertion(bool requireCancel)
  2207. {
  2208. if (!requireCancel)
  2209. {
  2210. XmlElement result = CreateWsspAssertion(MustNotSendCancelName);
  2211. return result;
  2212. }
  2213. else
  2214. {
  2215. return null;
  2216. }
  2217. }
  2218. public virtual bool TryImportWsspMustNotSendCancelAssertion(ICollection<XmlElement> assertions, out bool requireCancellation)
  2219. {
  2220. requireCancellation = !TryImportWsspAssertion(assertions, MustNotSendCancelName);
  2221. return true;
  2222. }
  2223. public virtual XmlElement CreateWsspSpnegoContextTokenAssertion(MetadataExporter exporter, SspiSecurityTokenParameters parameters)
  2224. {
  2225. XmlElement result = CreateWsspAssertion(SpnegoContextTokenName);
  2226. SetIncludeTokenValue(result, parameters.InclusionMode);
  2227. result.AppendChild(
  2228. CreateWspPolicyWrapper(
  2229. exporter,
  2230. CreateWsspRequireDerivedKeysAssertion(parameters.RequireDerivedKeys),
  2231. CreateWsspMustNotSendCancelAssertion(parameters.RequireCancellation)
  2232. ));
  2233. return result;
  2234. }
  2235. public virtual bool TryImportWsspSpnegoContextTokenAssertion(MetadataImporter importer, XmlElement assertion, out SecurityTokenParameters parameters)
  2236. {
  2237. parameters = null;
  2238. SecurityTokenInclusionMode inclusionMode;
  2239. Collection<Collection<XmlElement>> alternatives;
  2240. if (IsWsspAssertion(assertion, SpnegoContextTokenName)
  2241. && TryGetIncludeTokenValue(assertion, out inclusionMode))
  2242. {
  2243. if (TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  2244. {
  2245. foreach (Collection<XmlElement> alternative in alternatives)
  2246. {
  2247. SspiSecurityTokenParameters sspi = new SspiSecurityTokenParameters();
  2248. parameters = sspi;
  2249. bool requireCancellation;
  2250. if (TryImportWsspRequireDerivedKeysAssertion(alternative, sspi)
  2251. && TryImportWsspMustNotSendCancelAssertion(alternative, out requireCancellation)
  2252. && alternative.Count == 0)
  2253. {
  2254. sspi.RequireCancellation = requireCancellation;
  2255. sspi.InclusionMode = inclusionMode;
  2256. break;
  2257. }
  2258. else
  2259. {
  2260. parameters = null;
  2261. }
  2262. }
  2263. }
  2264. else
  2265. {
  2266. parameters = new SspiSecurityTokenParameters();
  2267. parameters.RequireDerivedKeys = false;
  2268. parameters.InclusionMode = inclusionMode;
  2269. }
  2270. }
  2271. return parameters != null;
  2272. }
  2273. public abstract XmlElement CreateWsspHttpsTokenAssertion(MetadataExporter exporter, HttpsTransportBindingElement httpsBinding);
  2274. public abstract bool TryImportWsspHttpsTokenAssertion(MetadataImporter importer, ICollection<XmlElement> assertions, HttpsTransportBindingElement httpsBinding);
  2275. public virtual bool ContainsWsspHttpsTokenAssertion(ICollection<XmlElement> assertions)
  2276. {
  2277. return (PolicyConversionContext.FindAssertion(assertions, HttpsTokenName, this.WsspNamespaceUri, false) != null);
  2278. }
  2279. public virtual XmlElement CreateMsspRequireClientCertificateAssertion(bool requireClientCertificate)
  2280. {
  2281. if (requireClientCertificate)
  2282. {
  2283. return CreateMsspAssertion(RequireClientCertificateName);
  2284. }
  2285. else
  2286. {
  2287. return null;
  2288. }
  2289. }
  2290. public virtual bool TryImportMsspRequireClientCertificateAssertion(ICollection<XmlElement> assertions, SslSecurityTokenParameters parameters)
  2291. {
  2292. parameters.RequireClientCertificate = TryImportMsspAssertion(assertions, RequireClientCertificateName);
  2293. return true;
  2294. }
  2295. public virtual XmlElement CreateMsspSslContextTokenAssertion(MetadataExporter exporter, SslSecurityTokenParameters parameters)
  2296. {
  2297. XmlElement result = CreateMsspAssertion(SslContextTokenName);
  2298. SetIncludeTokenValue(result, parameters.InclusionMode);
  2299. result.AppendChild(
  2300. CreateWspPolicyWrapper(
  2301. exporter,
  2302. CreateWsspRequireDerivedKeysAssertion(parameters.RequireDerivedKeys),
  2303. CreateWsspMustNotSendCancelAssertion(parameters.RequireCancellation),
  2304. CreateMsspRequireClientCertificateAssertion(parameters.RequireClientCertificate)
  2305. ));
  2306. return result;
  2307. }
  2308. public virtual bool TryImportMsspSslContextTokenAssertion(MetadataImporter importer, XmlElement assertion, out SecurityTokenParameters parameters)
  2309. {
  2310. parameters = null;
  2311. SecurityTokenInclusionMode inclusionMode;
  2312. Collection<Collection<XmlElement>> alternatives;
  2313. if (IsMsspAssertion(assertion, SslContextTokenName)
  2314. && TryGetIncludeTokenValue(assertion, out inclusionMode))
  2315. {
  2316. if (TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  2317. {
  2318. foreach (Collection<XmlElement> alternative in alternatives)
  2319. {
  2320. SslSecurityTokenParameters ssl = new SslSecurityTokenParameters();
  2321. parameters = ssl;
  2322. bool requireCancellation;
  2323. if (TryImportWsspRequireDerivedKeysAssertion(alternative, ssl)
  2324. && TryImportWsspMustNotSendCancelAssertion(alternative, out requireCancellation)
  2325. && TryImportMsspRequireClientCertificateAssertion(alternative, ssl)
  2326. && alternative.Count == 0)
  2327. {
  2328. ssl.RequireCancellation = requireCancellation;
  2329. ssl.InclusionMode = inclusionMode;
  2330. break;
  2331. }
  2332. else
  2333. {
  2334. parameters = null;
  2335. }
  2336. }
  2337. }
  2338. else
  2339. {
  2340. parameters = new SslSecurityTokenParameters();
  2341. parameters.RequireDerivedKeys = false;
  2342. parameters.InclusionMode = inclusionMode;
  2343. }
  2344. }
  2345. return parameters != null;
  2346. }
  2347. public virtual XmlElement CreateWsspBootstrapPolicyAssertion(MetadataExporter exporter, SecurityBindingElement bootstrapSecurity)
  2348. {
  2349. if (bootstrapSecurity == null)
  2350. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("bootstrapBinding");
  2351. WSSecurityPolicy sp = WSSecurityPolicy.GetSecurityPolicyDriver(bootstrapSecurity.MessageSecurityVersion);
  2352. // create complete bootstrap binding
  2353. CustomBinding bootstrapBinding = new CustomBinding(bootstrapSecurity);
  2354. if (exporter.State.ContainsKey(SecurityPolicyStrings.SecureConversationBootstrapBindingElementsBelowSecurityKey))
  2355. {
  2356. BindingElementCollection bindingElementsBelowSecurity = exporter.State[SecurityPolicyStrings.SecureConversationBootstrapBindingElementsBelowSecurityKey] as BindingElementCollection;
  2357. if (bindingElementsBelowSecurity != null)
  2358. {
  2359. foreach (BindingElement be in bindingElementsBelowSecurity)
  2360. {
  2361. bootstrapBinding.Elements.Add(be);
  2362. }
  2363. }
  2364. }
  2365. // generate policy for the "how" of security
  2366. ServiceEndpoint bootstrapEndpoint = new ServiceEndpoint(NullContract);
  2367. bootstrapEndpoint.Binding = bootstrapBinding;
  2368. PolicyConversionContext policyContext = exporter.ExportPolicy(bootstrapEndpoint);
  2369. // generate policy for the "what" of security (protection assertions)
  2370. // hard-coded requirements in V1: sign and encrypt RST and RSTR body
  2371. ChannelProtectionRequirements bootstrapProtection = new ChannelProtectionRequirements();
  2372. bootstrapProtection.IncomingEncryptionParts.AddParts(new MessagePartSpecification(true));
  2373. bootstrapProtection.OutgoingEncryptionParts.AddParts(new MessagePartSpecification(true));
  2374. bootstrapProtection.IncomingSignatureParts.AddParts(new MessagePartSpecification(true));
  2375. bootstrapProtection.OutgoingSignatureParts.AddParts(new MessagePartSpecification(true));
  2376. // add boostrap binding protection requirements (e.g. addressing headers)
  2377. ChannelProtectionRequirements cpr = bootstrapBinding.GetProperty<ChannelProtectionRequirements>(new BindingParameterCollection());
  2378. if (cpr != null)
  2379. {
  2380. bootstrapProtection.Add(cpr);
  2381. }
  2382. // extract channel-scope protection requirements and union them across request and response
  2383. MessagePartSpecification encryption = new MessagePartSpecification();
  2384. encryption.Union(bootstrapProtection.IncomingEncryptionParts.ChannelParts);
  2385. encryption.Union(bootstrapProtection.OutgoingEncryptionParts.ChannelParts);
  2386. encryption.MakeReadOnly();
  2387. MessagePartSpecification signature = new MessagePartSpecification();
  2388. signature.Union(bootstrapProtection.IncomingSignatureParts.ChannelParts);
  2389. signature.Union(bootstrapProtection.OutgoingSignatureParts.ChannelParts);
  2390. signature.MakeReadOnly();
  2391. // create final boostrap policy assertion
  2392. XmlElement nestedPolicy = CreateWspPolicyWrapper(
  2393. exporter,
  2394. sp.CreateWsspSignedPartsAssertion(signature),
  2395. sp.CreateWsspEncryptedPartsAssertion(encryption));
  2396. foreach (XmlElement e in sp.FilterWsspPolicyAssertions(policyContext.GetBindingAssertions()))
  2397. {
  2398. nestedPolicy.AppendChild(e);
  2399. }
  2400. XmlElement result = CreateWsspAssertion(BootstrapPolicyName);
  2401. result.AppendChild(nestedPolicy);
  2402. return result;
  2403. }
  2404. public virtual ICollection<XmlElement> FilterWsspPolicyAssertions(ICollection<XmlElement> policyAssertions)
  2405. {
  2406. Collection<XmlElement> result = new Collection<XmlElement>();
  2407. foreach (XmlElement assertion in policyAssertions)
  2408. if (IsWsspAssertion(assertion))
  2409. result.Add(assertion);
  2410. return result;
  2411. }
  2412. public virtual bool TryImportWsspBootstrapPolicyAssertion(MetadataImporter importer, ICollection<XmlElement> assertions, SecureConversationSecurityTokenParameters parameters)
  2413. {
  2414. bool result = false;
  2415. XmlElement assertion;
  2416. Collection<Collection<XmlElement>> alternatives;
  2417. if (TryImportWsspAssertion(assertions, BootstrapPolicyName, out assertion)
  2418. && TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  2419. {
  2420. BindingElementCollection bindingElements;
  2421. importer.State[SecurityBindingElementImporter.InSecureConversationBootstrapBindingImportMode] = SecurityBindingElementImporter.InSecureConversationBootstrapBindingImportMode;
  2422. try
  2423. {
  2424. bindingElements = importer.ImportPolicy(NullServiceEndpoint, alternatives);
  2425. if (importer.State.ContainsKey(SecurityBindingElementImporter.SecureConversationBootstrapEncryptionRequirements))
  2426. {
  2427. MessagePartSpecification encryption = (MessagePartSpecification)importer.State[SecurityBindingElementImporter.SecureConversationBootstrapEncryptionRequirements];
  2428. if (encryption.IsBodyIncluded != true)
  2429. {
  2430. importer.Errors.Add(new MetadataConversionError(SR.GetString(SR.UnsupportedSecureConversationBootstrapProtectionRequirements), false));
  2431. bindingElements = null;
  2432. }
  2433. }
  2434. if (importer.State.ContainsKey(SecurityBindingElementImporter.SecureConversationBootstrapSignatureRequirements))
  2435. {
  2436. MessagePartSpecification signature = (MessagePartSpecification)importer.State[SecurityBindingElementImporter.SecureConversationBootstrapSignatureRequirements];
  2437. if (signature.IsBodyIncluded != true)
  2438. {
  2439. importer.Errors.Add(new MetadataConversionError(SR.GetString(SR.UnsupportedSecureConversationBootstrapProtectionRequirements), false));
  2440. bindingElements = null;
  2441. }
  2442. }
  2443. }
  2444. finally
  2445. {
  2446. importer.State.Remove(SecurityBindingElementImporter.InSecureConversationBootstrapBindingImportMode);
  2447. if (importer.State.ContainsKey(SecurityBindingElementImporter.SecureConversationBootstrapEncryptionRequirements))
  2448. importer.State.Remove(SecurityBindingElementImporter.SecureConversationBootstrapEncryptionRequirements);
  2449. if (importer.State.ContainsKey(SecurityBindingElementImporter.SecureConversationBootstrapSignatureRequirements))
  2450. importer.State.Remove(SecurityBindingElementImporter.SecureConversationBootstrapSignatureRequirements);
  2451. }
  2452. if (bindingElements != null)
  2453. {
  2454. parameters.BootstrapSecurityBindingElement = bindingElements.Find<SecurityBindingElement>();
  2455. return true;
  2456. }
  2457. else
  2458. {
  2459. parameters.BootstrapSecurityBindingElement = null;
  2460. return true; // Consider returning false here.
  2461. }
  2462. }
  2463. return result;
  2464. }
  2465. public virtual XmlElement CreateWsspSecureConversationTokenAssertion(MetadataExporter exporter, SecureConversationSecurityTokenParameters parameters)
  2466. {
  2467. XmlElement result = CreateWsspAssertion(SecureConversationTokenName);
  2468. SetIncludeTokenValue(result, parameters.InclusionMode);
  2469. result.AppendChild(
  2470. CreateWspPolicyWrapper(
  2471. exporter,
  2472. CreateWsspRequireDerivedKeysAssertion(parameters.RequireDerivedKeys),
  2473. CreateWsspMustNotSendCancelAssertion(parameters.RequireCancellation),
  2474. CreateWsspBootstrapPolicyAssertion(exporter, parameters.BootstrapSecurityBindingElement)
  2475. ));
  2476. return result;
  2477. }
  2478. public virtual bool TryImportWsspSecureConversationTokenAssertion(MetadataImporter importer, XmlElement assertion, out SecurityTokenParameters parameters)
  2479. {
  2480. parameters = null;
  2481. SecurityTokenInclusionMode inclusionMode;
  2482. Collection<Collection<XmlElement>> alternatives;
  2483. if (IsWsspAssertion(assertion, SecureConversationTokenName)
  2484. && TryGetIncludeTokenValue(assertion, out inclusionMode))
  2485. {
  2486. if (TryGetNestedPolicyAlternatives(importer, assertion, out alternatives))
  2487. {
  2488. foreach (Collection<XmlElement> alternative in alternatives)
  2489. {
  2490. SecureConversationSecurityTokenParameters sc = new SecureConversationSecurityTokenParameters();
  2491. parameters = sc;
  2492. bool requireCancellation;
  2493. if (TryImportWsspRequireDerivedKeysAssertion(alternative, sc)
  2494. && TryImportWsspMustNotSendCancelAssertion(alternative, out requireCancellation)
  2495. && TryImportWsspBootstrapPolicyAssertion(importer, alternative, sc)
  2496. && alternative.Count == 0)
  2497. {
  2498. sc.RequireCancellation = requireCancellation;
  2499. sc.InclusionMode = inclusionMode;
  2500. break;
  2501. }
  2502. else
  2503. {
  2504. parameters = null;
  2505. }
  2506. }
  2507. }
  2508. else
  2509. {
  2510. parameters = new SecureConversationSecurityTokenParameters();
  2511. parameters.InclusionMode = inclusionMode;
  2512. parameters.RequireDerivedKeys = false;
  2513. }
  2514. }
  2515. return parameters != null;
  2516. }
  2517. class TokenIssuerPolicyResolver
  2518. {
  2519. const string WSIdentityNamespace = @"http://schemas.xmlsoap.org/ws/2005/05/identity";
  2520. static readonly Uri SelfIssuerUri = new Uri(WSIdentityNamespace + "/issuer/self");
  2521. TrustDriver trustDriver;
  2522. public TokenIssuerPolicyResolver(TrustDriver driver)
  2523. {
  2524. this.trustDriver = driver;
  2525. }
  2526. public void ResolveTokenIssuerPolicy(MetadataImporter importer, PolicyConversionContext policyContext, IssuedSecurityTokenParameters parameters)
  2527. {
  2528. if (policyContext == null)
  2529. {
  2530. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("policyContext");
  2531. }
  2532. if (parameters == null)
  2533. {
  2534. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("parameters");
  2535. }
  2536. EndpointAddress mexAddress = (parameters.IssuerMetadataAddress != null) ? parameters.IssuerMetadataAddress : parameters.IssuerAddress;
  2537. if (mexAddress == null || mexAddress.IsAnonymous || mexAddress.Uri.Equals(SelfIssuerUri))
  2538. {
  2539. return;
  2540. }
  2541. int maximumRedirections = (int)importer.State[SecurityBindingElementImporter.MaxPolicyRedirectionsKey];
  2542. if (maximumRedirections <= 0)
  2543. {
  2544. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MaximumPolicyRedirectionsExceeded)));
  2545. }
  2546. --maximumRedirections;
  2547. //
  2548. // Try to retrieve the proxy from the importer.State bag so that we can have secure mex
  2549. // and it fails, then we can create a default one
  2550. //
  2551. MetadataExchangeClient policyFetcher = null;
  2552. if ((importer.State != null) && (importer.State.ContainsKey(MetadataExchangeClient.MetadataExchangeClientKey)))
  2553. {
  2554. policyFetcher = importer.State[MetadataExchangeClient.MetadataExchangeClientKey] as MetadataExchangeClient;
  2555. }
  2556. if (policyFetcher == null)
  2557. policyFetcher = new MetadataExchangeClient(mexAddress);
  2558. ServiceEndpointCollection federationEndpoints = null;
  2559. MetadataSet metadataSet = null;
  2560. Exception mexException = null;
  2561. try
  2562. {
  2563. metadataSet = policyFetcher.GetMetadata(mexAddress);
  2564. }
  2565. catch (Exception e)
  2566. {
  2567. if (Fx.IsFatal(e))
  2568. throw;
  2569. if (e is NullReferenceException)
  2570. throw;
  2571. mexException = e;
  2572. }
  2573. //
  2574. // DCR 6729: Try the http get option here if mex failed.
  2575. //
  2576. if (metadataSet == null )
  2577. {
  2578. try
  2579. {
  2580. metadataSet = policyFetcher.GetMetadata(mexAddress.Uri, MetadataExchangeClientMode.HttpGet);
  2581. }
  2582. catch (Exception e)
  2583. {
  2584. if (Fx.IsFatal(e))
  2585. throw;
  2586. if (e is NullReferenceException)
  2587. throw;
  2588. if (mexException == null)
  2589. mexException = e;
  2590. }
  2591. }
  2592. if (metadataSet == null)
  2593. {
  2594. //
  2595. // we could not retrieve the metadata from the issuer for some reason
  2596. //
  2597. if (mexException != null)
  2598. importer.Errors.Add(new MetadataConversionError(SR.GetString(SR.UnableToObtainIssuerMetadata, mexAddress, mexException), false));
  2599. return;
  2600. }
  2601. WsdlImporter wsdlImporter;
  2602. // NOTE: [....], Policy import/export is seperate from WSDL however, this policy importer
  2603. // invokes the WsdlImporter. In the event that the current MetadataImporter is a WsdlImporter,
  2604. // we should use it's collection of extensions for the import process. Other wise
  2605. WsdlImporter currentWsdlImporter = importer as WsdlImporter;
  2606. if (currentWsdlImporter != null)
  2607. {
  2608. wsdlImporter = new WsdlImporter(metadataSet, importer.PolicyImportExtensions, currentWsdlImporter.WsdlImportExtensions);
  2609. }
  2610. else
  2611. {
  2612. wsdlImporter = new WsdlImporter(metadataSet, importer.PolicyImportExtensions, null);
  2613. }
  2614. //
  2615. // Copy the State from the first importer to the second one so that the state can be passed to the second round wsdl retrieval
  2616. //
  2617. if ((importer.State != null) && (importer.State.ContainsKey(MetadataExchangeClient.MetadataExchangeClientKey)))
  2618. {
  2619. wsdlImporter.State.Add(MetadataExchangeClient.MetadataExchangeClientKey, importer.State[MetadataExchangeClient.MetadataExchangeClientKey]);
  2620. }
  2621. wsdlImporter.State.Add(SecurityBindingElementImporter.MaxPolicyRedirectionsKey, maximumRedirections);
  2622. federationEndpoints = wsdlImporter.ImportAllEndpoints();
  2623. // copy all the import errors into the current metadata importer
  2624. for (int i = 0; i < wsdlImporter.Errors.Count; ++i)
  2625. {
  2626. MetadataConversionError error = wsdlImporter.Errors[i];
  2627. importer.Errors.Add(new MetadataConversionError(SR.GetString(SR.ErrorImportingIssuerMetadata, mexAddress, InsertEllipsisIfTooLong(error.Message)), error.IsWarning));
  2628. }
  2629. if (federationEndpoints != null)
  2630. {
  2631. AddCompatibleFederationEndpoints(federationEndpoints, parameters);
  2632. if (parameters.AlternativeIssuerEndpoints != null && parameters.AlternativeIssuerEndpoints.Count > 0)
  2633. {
  2634. importer.Errors.Add(new MetadataConversionError(SR.GetString(SR.MultipleIssuerEndpointsFound, mexAddress)));
  2635. }
  2636. }
  2637. }
  2638. static string InsertEllipsisIfTooLong(string message)
  2639. {
  2640. const int MaxLength = 1024;
  2641. const string Ellipsis = "....";
  2642. if (message != null && message.Length > MaxLength)
  2643. {
  2644. return String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}{1}{2}",
  2645. message.Substring(0, (MaxLength - Ellipsis.Length) / 2),
  2646. Ellipsis,
  2647. message.Substring(message.Length - (MaxLength - Ellipsis.Length) / 2));
  2648. }
  2649. return message;
  2650. }
  2651. void AddCompatibleFederationEndpoints(ServiceEndpointCollection serviceEndpoints, IssuedSecurityTokenParameters parameters)
  2652. {
  2653. // check if an explicit issuer address has been specified. If so,add the endpoint corresponding to that address only. If not add all acceptable endpoints.
  2654. bool isIssuerSpecified = (parameters.IssuerAddress != null && !parameters.IssuerAddress.IsAnonymous);
  2655. foreach (ServiceEndpoint endpoint in serviceEndpoints)
  2656. {
  2657. TrustDriver trustDriver;
  2658. if (!TryGetTrustDriver(endpoint, out trustDriver))
  2659. {
  2660. // if endpoint does not have trustDriver, assume
  2661. // parent trustDriver.
  2662. trustDriver = this.trustDriver;
  2663. }
  2664. bool isFederationContract = false;
  2665. ContractDescription contract = endpoint.Contract;
  2666. for (int j = 0; j < contract.Operations.Count; ++j)
  2667. {
  2668. OperationDescription operation = contract.Operations[j];
  2669. bool hasIncomingRst = false;
  2670. bool hasOutgoingRstr = false;
  2671. for (int k = 0; k < operation.Messages.Count; ++k)
  2672. {
  2673. MessageDescription message = operation.Messages[k];
  2674. if (message.Action == trustDriver.RequestSecurityTokenAction.Value && message.Direction == MessageDirection.Input)
  2675. {
  2676. hasIncomingRst = true;
  2677. }
  2678. else if ((((trustDriver.StandardsManager.TrustVersion == TrustVersion.WSTrustFeb2005) && (message.Action == trustDriver.RequestSecurityTokenResponseAction.Value)) ||
  2679. ((trustDriver.StandardsManager.TrustVersion == TrustVersion.WSTrust13) && (message.Action == trustDriver.RequestSecurityTokenResponseFinalAction.Value))) &&
  2680. message.Direction == MessageDirection.Output)
  2681. {
  2682. hasOutgoingRstr = true;
  2683. }
  2684. }
  2685. if (hasIncomingRst && hasOutgoingRstr)
  2686. {
  2687. isFederationContract = true;
  2688. break;
  2689. }
  2690. }
  2691. if (isFederationContract)
  2692. {
  2693. // skip if it is not an acceptable endpoint
  2694. if (isIssuerSpecified && !parameters.IssuerAddress.Uri.Equals(endpoint.Address.Uri))
  2695. {
  2696. continue;
  2697. }
  2698. if (parameters.IssuerBinding == null)
  2699. {
  2700. parameters.IssuerAddress = endpoint.Address;
  2701. parameters.IssuerBinding = endpoint.Binding;
  2702. }
  2703. else
  2704. {
  2705. IssuedSecurityTokenParameters.AlternativeIssuerEndpoint endpointInfo = new IssuedSecurityTokenParameters.AlternativeIssuerEndpoint();
  2706. endpointInfo.IssuerAddress = endpoint.Address;
  2707. endpointInfo.IssuerBinding = endpoint.Binding;
  2708. parameters.AlternativeIssuerEndpoints.Add(endpointInfo);
  2709. }
  2710. }
  2711. }
  2712. }
  2713. bool TryGetTrustDriver(ServiceEndpoint endpoint, out TrustDriver trustDriver)
  2714. {
  2715. SecurityBindingElement sbe = endpoint.Binding.CreateBindingElements().Find<SecurityBindingElement>();
  2716. trustDriver = null;
  2717. if (sbe != null)
  2718. {
  2719. MessageSecurityVersion messageSecurityVersion = sbe.MessageSecurityVersion;
  2720. if (messageSecurityVersion.TrustVersion == TrustVersion.WSTrustFeb2005)
  2721. {
  2722. trustDriver = new WSTrustFeb2005.DriverFeb2005(new SecurityStandardsManager(messageSecurityVersion, WSSecurityTokenSerializer.DefaultInstance));
  2723. }
  2724. else if (messageSecurityVersion.TrustVersion == TrustVersion.WSTrust13)
  2725. {
  2726. trustDriver = new WSTrustDec2005.DriverDec2005(new SecurityStandardsManager(messageSecurityVersion, WSSecurityTokenSerializer.DefaultInstance));
  2727. }
  2728. }
  2729. return trustDriver != null;
  2730. }
  2731. }
  2732. public static bool TryGetSecurityPolicyDriver(ICollection<XmlElement> assertions, out WSSecurityPolicy securityPolicy)
  2733. {
  2734. SecurityPolicyManager policyManager = new SecurityPolicyManager();
  2735. return policyManager.TryGetSecurityPolicyDriver(assertions, out securityPolicy);
  2736. }
  2737. public static WSSecurityPolicy GetSecurityPolicyDriver(MessageSecurityVersion version)
  2738. {
  2739. SecurityPolicyManager policyManager = new SecurityPolicyManager();
  2740. return policyManager.GetSecurityPolicyDriver(version);
  2741. }
  2742. class SecurityPolicyManager
  2743. {
  2744. List<WSSecurityPolicy> drivers;
  2745. public SecurityPolicyManager()
  2746. {
  2747. this.drivers = new List<WSSecurityPolicy>();
  2748. Initialize();
  2749. }
  2750. public void Initialize()
  2751. {
  2752. this.drivers.Add(new WSSecurityPolicy11());
  2753. this.drivers.Add(new WSSecurityPolicy12());
  2754. }
  2755. public bool TryGetSecurityPolicyDriver(ICollection<XmlElement> assertions, out WSSecurityPolicy securityPolicy)
  2756. {
  2757. securityPolicy = null;
  2758. for (int i = 0; i < this.drivers.Count; ++i)
  2759. {
  2760. if (this.drivers[i].CanImportAssertion(assertions))
  2761. {
  2762. securityPolicy = this.drivers[i];
  2763. return true;
  2764. }
  2765. }
  2766. return false;
  2767. }
  2768. public WSSecurityPolicy GetSecurityPolicyDriver(MessageSecurityVersion version)
  2769. {
  2770. for (int i = 0; i < this.drivers.Count; ++i)
  2771. {
  2772. if (this.drivers[i].IsSecurityVersionSupported(version))
  2773. {
  2774. return this.drivers[i];
  2775. }
  2776. }
  2777. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException());
  2778. }
  2779. }
  2780. }
  2781. static class SecurityPolicyStrings
  2782. {
  2783. public const string SecureConversationBootstrapBindingElementsBelowSecurityKey = "SecureConversationBootstrapBindingElementsBelowSecurityKey";
  2784. }
  2785. }