LaxModeSecurityHeaderElementInferenceEngine.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. //----------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel.Security
  5. {
  6. using System.ServiceModel.Channels;
  7. using System.ServiceModel.Security.Tokens;
  8. using System.Xml;
  9. using SignedXml = System.IdentityModel.SignedXml;
  10. using StandardSignedInfo = System.IdentityModel.StandardSignedInfo;
  11. class LaxModeSecurityHeaderElementInferenceEngine : SecurityHeaderElementInferenceEngine
  12. {
  13. static LaxModeSecurityHeaderElementInferenceEngine instance = new LaxModeSecurityHeaderElementInferenceEngine();
  14. protected LaxModeSecurityHeaderElementInferenceEngine() { }
  15. internal static LaxModeSecurityHeaderElementInferenceEngine Instance
  16. {
  17. get { return instance; }
  18. }
  19. public override void ExecuteProcessingPasses(ReceiveSecurityHeader securityHeader, XmlDictionaryReader reader)
  20. {
  21. // pass 1
  22. securityHeader.ExecuteReadingPass(reader);
  23. // pass 1.5
  24. securityHeader.ExecuteDerivedKeyTokenStubPass(false);
  25. // pass 2
  26. securityHeader.ExecuteSubheaderDecryptionPass();
  27. // pass 2.5
  28. securityHeader.ExecuteDerivedKeyTokenStubPass(true);
  29. // layout-specific inferences
  30. MarkElements(securityHeader.ElementManager, securityHeader.RequireMessageProtection);
  31. // pass 3
  32. securityHeader.ExecuteSignatureEncryptionProcessingPass();
  33. }
  34. public override void MarkElements(ReceiveSecurityHeaderElementManager elementManager, bool messageSecurityMode)
  35. {
  36. bool primarySignatureFound = false;
  37. for (int position = 0; position < elementManager.Count; position++)
  38. {
  39. ReceiveSecurityHeaderEntry entry;
  40. elementManager.GetElementEntry(position, out entry);
  41. if (entry.elementCategory == ReceiveSecurityHeaderElementCategory.Signature)
  42. {
  43. if (!messageSecurityMode)
  44. {
  45. elementManager.SetBindingMode(position, ReceiveSecurityHeaderBindingModes.Endorsing);
  46. continue;
  47. }
  48. SignedXml signedXml = (SignedXml)entry.element;
  49. StandardSignedInfo signedInfo = (StandardSignedInfo)signedXml.Signature.SignedInfo;
  50. bool targetsSignature = false;
  51. if (signedInfo.ReferenceCount == 1)
  52. {
  53. string uri = signedInfo[0].Uri;
  54. string id;
  55. if (uri != null && uri.Length > 1 && uri[0] == '#')
  56. {
  57. id = uri.Substring(1);
  58. }
  59. else
  60. {
  61. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
  62. new MessageSecurityException(SR.GetString(SR.UnableToResolveReferenceUriForSignature, uri)));
  63. }
  64. for (int j = 0; j < elementManager.Count; j++)
  65. {
  66. ReceiveSecurityHeaderEntry inner;
  67. elementManager.GetElementEntry(j, out inner);
  68. if (j != position && inner.elementCategory == ReceiveSecurityHeaderElementCategory.Signature && inner.id == id)
  69. {
  70. targetsSignature = true;
  71. break;
  72. }
  73. }
  74. }
  75. if (targetsSignature)
  76. {
  77. elementManager.SetBindingMode(position, ReceiveSecurityHeaderBindingModes.Endorsing);
  78. continue;
  79. }
  80. else
  81. {
  82. if (primarySignatureFound)
  83. {
  84. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.AtMostOnePrimarySignatureInReceiveSecurityHeader)));
  85. }
  86. primarySignatureFound = true;
  87. elementManager.SetBindingMode(position, ReceiveSecurityHeaderBindingModes.Primary);
  88. continue;
  89. }
  90. }
  91. }
  92. }
  93. }
  94. }