//----------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.ServiceModel.Description { using System; using System.Collections.ObjectModel; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Dispatcher; public sealed class ServiceSecurityAuditBehavior : IServiceBehavior { internal const AuditLogLocation defaultAuditLogLocation = AuditLogLocation.Default; internal const bool defaultSuppressAuditFailure = true; internal const AuditLevel defaultServiceAuthorizationAuditLevel = AuditLevel.None; internal const AuditLevel defaultMessageAuthenticationAuditLevel = AuditLevel.None; AuditLogLocation auditLogLocation; bool suppressAuditFailure; AuditLevel serviceAuthorizationAuditLevel; AuditLevel messageAuthenticationAuditLevel; public ServiceSecurityAuditBehavior() { this.auditLogLocation = ServiceSecurityAuditBehavior.defaultAuditLogLocation; this.suppressAuditFailure = ServiceSecurityAuditBehavior.defaultSuppressAuditFailure; this.serviceAuthorizationAuditLevel = ServiceSecurityAuditBehavior.defaultServiceAuthorizationAuditLevel; this.messageAuthenticationAuditLevel = ServiceSecurityAuditBehavior.defaultMessageAuthenticationAuditLevel; } ServiceSecurityAuditBehavior(ServiceSecurityAuditBehavior behavior) { this.auditLogLocation = behavior.auditLogLocation; this.suppressAuditFailure = behavior.suppressAuditFailure; this.serviceAuthorizationAuditLevel = behavior.serviceAuthorizationAuditLevel; this.messageAuthenticationAuditLevel = behavior.messageAuthenticationAuditLevel; } public AuditLogLocation AuditLogLocation { get { return this.auditLogLocation; } set { if (!AuditLogLocationHelper.IsDefined(value)) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value")); this.auditLogLocation = value; } } public bool SuppressAuditFailure { get { return this.suppressAuditFailure; } set { this.suppressAuditFailure = value; } } public AuditLevel ServiceAuthorizationAuditLevel { get { return this.serviceAuthorizationAuditLevel; } set { if (!AuditLevelHelper.IsDefined(value)) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value")); this.serviceAuthorizationAuditLevel = value; } } public AuditLevel MessageAuthenticationAuditLevel { get { return this.messageAuthenticationAuditLevel; } set { if (!AuditLevelHelper.IsDefined(value)) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value")); this.messageAuthenticationAuditLevel = value; } } internal ServiceSecurityAuditBehavior Clone() { return new ServiceSecurityAuditBehavior(this); } void IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase) { } void IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection endpoints, BindingParameterCollection parameters) { if (parameters == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("parameters")); parameters.Add(this); } void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase) { if (description == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("description")); if (serviceHostBase == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("serviceHostBase")); for (int i = 0; i < serviceHostBase.ChannelDispatchers.Count; i++) { ChannelDispatcher channelDispatcher = serviceHostBase.ChannelDispatchers[i] as ChannelDispatcher; if (channelDispatcher != null) { foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints) { if (!endpointDispatcher.IsSystemEndpoint) { DispatchRuntime behavior = endpointDispatcher.DispatchRuntime; behavior.SecurityAuditLogLocation = this.auditLogLocation; behavior.SuppressAuditFailure = this.suppressAuditFailure; behavior.ServiceAuthorizationAuditLevel = this.serviceAuthorizationAuditLevel; behavior.MessageAuthenticationAuditLevel = this.messageAuthenticationAuditLevel; } } } } } } }