| File: System\ServiceModel\Description\ClientCredentials.cs | Web Access |
| Project: src\src\System.ServiceModel.Primitives\src\System.ServiceModel.Primitives.csproj (System.ServiceModel.Primitives) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System.IdentityModel.Selectors; using System.ServiceModel.Channels; using System.ServiceModel.Dispatcher; using System.ServiceModel.Security; namespace System.ServiceModel.Description { public class ClientCredentials : SecurityCredentialsManager, IEndpointBehavior { private UserNamePasswordClientCredential _userName; private X509CertificateInitiatorClientCredential _clientCertificate; private X509CertificateRecipientClientCredential _serviceCertificate; private WindowsClientCredential _windows; private HttpDigestClientCredential _httpDigest; private bool _isReadOnly; public ClientCredentials() { } protected ClientCredentials(ClientCredentials other) { if (other == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(other)); } if (other._userName != null) { _userName = new UserNamePasswordClientCredential(other._userName); } if (other._clientCertificate != null) { _clientCertificate = new X509CertificateInitiatorClientCredential(other._clientCertificate); } if (other._serviceCertificate != null) { _serviceCertificate = new X509CertificateRecipientClientCredential(other._serviceCertificate); } if (other._windows != null) { _windows = new WindowsClientCredential(other._windows); } if (other._httpDigest != null) { _httpDigest = new HttpDigestClientCredential(other._httpDigest); } _isReadOnly = other._isReadOnly; } public UserNamePasswordClientCredential UserName { get { if (_userName == null) { _userName = new UserNamePasswordClientCredential(); if (_isReadOnly) { _userName.MakeReadOnly(); } } return _userName; } } public X509CertificateInitiatorClientCredential ClientCertificate { get { if (_clientCertificate == null) { _clientCertificate = new X509CertificateInitiatorClientCredential(); if (_isReadOnly) { _clientCertificate.MakeReadOnly(); } } return _clientCertificate; } } public X509CertificateRecipientClientCredential ServiceCertificate { get { if (_serviceCertificate == null) { _serviceCertificate = new X509CertificateRecipientClientCredential(); if (_isReadOnly) { _serviceCertificate.MakeReadOnly(); } } return _serviceCertificate; } } public WindowsClientCredential Windows { get { if (_windows == null) { _windows = new WindowsClientCredential(); if (_isReadOnly) { _windows.MakeReadOnly(); } } return _windows; } } public HttpDigestClientCredential HttpDigest { get { if (_httpDigest == null) { _httpDigest = new HttpDigestClientCredential(); if (_isReadOnly) { _httpDigest.MakeReadOnly(); } } return _httpDigest; } } internal static ClientCredentials CreateDefaultCredentials() { return new ClientCredentials(); } public override SecurityTokenManager CreateSecurityTokenManager() { return new ClientCredentialsSecurityTokenManager(Clone()); } protected virtual ClientCredentials CloneCore() { return new ClientCredentials(this); } public ClientCredentials Clone() { ClientCredentials result = CloneCore(); if (result == null || result.GetType() != GetType()) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(NotImplemented.ByDesignWithMessage(SRP.Format(SRP.CloneNotImplementedCorrectly, GetType(), (result != null) ? result.ToString() : "null"))); } return result; } void IEndpointBehavior.Validate(ServiceEndpoint serviceEndpoint) { } void IEndpointBehavior.AddBindingParameters(ServiceEndpoint serviceEndpoint, BindingParameterCollection bindingParameters) { if (bindingParameters == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(bindingParameters)); } // throw if bindingParameters already has a SecurityCredentialsManager SecurityCredentialsManager otherCredentialsManager = bindingParameters.Find<SecurityCredentialsManager>(); if (otherCredentialsManager != null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SRP.Format(SRP.MultipleSecurityCredentialsManagersInChannelBindingParameters, otherCredentialsManager))); } bindingParameters.Add(this); } void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, EndpointDispatcher endpointDispatcher) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException( SRP.Format(SRP.SFXEndpointBehaviorUsedOnWrongSide, typeof(ClientCredentials).Name))); } public virtual void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime behavior) { if (serviceEndpoint == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(serviceEndpoint)); } if (serviceEndpoint.Binding == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serviceEndpoint.Binding"); } if (serviceEndpoint.Binding.CreateBindingElements().Find<SecurityBindingElement>() == null) { return; } } // RC0 workaround to freeze credentials when the channel factory is opened internal void MakeReadOnly() { _isReadOnly = true; if (_clientCertificate != null) { _clientCertificate.MakeReadOnly(); } if (_serviceCertificate != null) { _serviceCertificate.MakeReadOnly(); } if (_userName != null) { _userName.MakeReadOnly(); } if (_windows != null) { _windows.MakeReadOnly(); } if (_httpDigest != null) { _httpDigest.MakeReadOnly(); } } } }