1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
//----------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace System.ServiceModel.Security
{
using System.IdentityModel.Tokens;
using System.ServiceModel.Channels;
using System.ServiceModel;
using System.IdentityModel.Selectors;
using System.ServiceModel.Security.Tokens;
class SessionSymmetricMessageSecurityProtocolFactory : MessageSecurityProtocolFactory
{
SecurityTokenParameters securityTokenParameters;
SessionDerivedKeySecurityTokenParameters derivedKeyTokenParameters;
public SessionSymmetricMessageSecurityProtocolFactory()
: base()
{
}
public SecurityTokenParameters SecurityTokenParameters
{
get
{
return this.securityTokenParameters;
}
set
{
ThrowIfImmutable();
this.securityTokenParameters = value;
}
}
public override EndpointIdentity GetIdentityOfSelf()
{
if (this.SecurityTokenManager is IEndpointIdentityProvider)
{
SecurityTokenRequirement requirement = CreateRecipientSecurityTokenRequirement();
this.SecurityTokenParameters.InitializeSecurityTokenRequirement(requirement);
return ((IEndpointIdentityProvider)this.SecurityTokenManager).GetIdentityOfSelf(requirement);
}
else
{
return base.GetIdentityOfSelf();
}
}
protected override SecurityProtocol OnCreateSecurityProtocol(EndpointAddress target, Uri via, object listenerSecurityState, TimeSpan timeout)
{
if (this.ActAsInitiator)
{
return new InitiatorSessionSymmetricMessageSecurityProtocol(this, target, via);
}
else
{
return new AcceptorSessionSymmetricMessageSecurityProtocol(this, null);
}
}
public override void OnOpen(TimeSpan timeout)
{
if (this.SecurityTokenParameters == null)
{
OnPropertySettingsError("SecurityTokenParameters", true);
}
if (this.SecurityTokenParameters.RequireDerivedKeys)
{
this.ExpectKeyDerivation = true;
this.derivedKeyTokenParameters = new SessionDerivedKeySecurityTokenParameters(this.ActAsInitiator);
}
base.OnOpen(timeout);
}
internal SecurityTokenParameters GetTokenParameters()
{
if (this.derivedKeyTokenParameters != null)
{
return this.derivedKeyTokenParameters;
}
else
{
return this.securityTokenParameters;
}
}
}
internal class SessionDerivedKeySecurityTokenParameters : SecurityTokenParameters
{
bool actAsInitiator;
protected SessionDerivedKeySecurityTokenParameters(SessionDerivedKeySecurityTokenParameters other)
: base(other)
{
this.actAsInitiator = other.actAsInitiator;
}
public SessionDerivedKeySecurityTokenParameters(bool actAsInitiator)
: base()
{
this.actAsInitiator = actAsInitiator;
this.InclusionMode = actAsInitiator ? SecurityTokenInclusionMode.AlwaysToRecipient : SecurityTokenInclusionMode.AlwaysToInitiator;
base.RequireDerivedKeys = false;
}
internal protected override bool SupportsClientAuthentication { get { return false; } }
internal protected override bool SupportsServerAuthentication { get { return false; } }
internal protected override bool SupportsClientWindowsIdentity { get { return false; } }
internal protected override bool HasAsymmetricKey { get { return false; } }
protected override SecurityTokenParameters CloneCore()
{
return new SessionDerivedKeySecurityTokenParameters(this);
}
internal protected override SecurityKeyIdentifierClause CreateKeyIdentifierClause(SecurityToken token, SecurityTokenReferenceStyle referenceStyle)
{
if (referenceStyle == SecurityTokenReferenceStyle.Internal)
{
return token.CreateKeyIdentifierClause<LocalIdKeyIdentifierClause>();
}
else
{
return null;
}
}
internal protected override bool MatchesKeyIdentifierClause(SecurityToken token, SecurityKeyIdentifierClause keyIdentifierClause, SecurityTokenReferenceStyle referenceStyle)
{
if (referenceStyle == SecurityTokenReferenceStyle.Internal)
{
LocalIdKeyIdentifierClause localClause = keyIdentifierClause as LocalIdKeyIdentifierClause;
if (localClause == null)
{
return false;
}
else
{
return (localClause.LocalId == token.Id);
}
}
else
{
return false;
}
}
protected internal override void InitializeSecurityTokenRequirement(SecurityTokenRequirement requirement)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException());
}
}
}
|