File: FrameworkFork\System.ServiceModel\System\IdentityModel\Selectors\SecurityTokenRequirement.cs
Web Access
Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib)
// 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.Collections.Generic;
using System.IdentityModel.Tokens;
using System.Runtime;
using System.ServiceModel;
 
namespace System.IdentityModel.Selectors
{
    public class SecurityTokenRequirement
    {
        private const string Namespace = "http://schemas.microsoft.com/ws/2006/05/identitymodel/securitytokenrequirement";
        private const string tokenTypeProperty = Namespace + "/TokenType";
        private const string keyUsageProperty = Namespace + "/KeyUsage";
        private const string keyTypeProperty = Namespace + "/KeyType";
        private const string keySizeProperty = Namespace + "/KeySize";
        private const string requireCryptographicTokenProperty = Namespace + "/RequireCryptographicToken";
        private const string peerAuthenticationMode = Namespace + "/PeerAuthenticationMode";
        private const string isOptionalTokenProperty = Namespace + "/IsOptionalTokenProperty";
 
        private const bool defaultRequireCryptographicToken = false;
        private const SecurityKeyUsage defaultKeyUsage = SecurityKeyUsage.Signature;
        private const SecurityKeyType defaultKeyType = SecurityKeyType.SymmetricKey;
        private const int defaultKeySize = 0;
        private const bool defaultIsOptionalToken = false;
 
        private Dictionary<string, object> _properties;
 
        public SecurityTokenRequirement()
        {
            _properties = new Dictionary<string, object>();
            this.Initialize();
        }
 
        static public string TokenTypeProperty { get { return tokenTypeProperty; } }
        static public string KeyUsageProperty { get { return keyUsageProperty; } }
        static public string KeyTypeProperty { get { return keyTypeProperty; } }
        static public string KeySizeProperty { get { return keySizeProperty; } }
        static public string RequireCryptographicTokenProperty { get { return requireCryptographicTokenProperty; } }
        static public string PeerAuthenticationMode { get { return peerAuthenticationMode; } }
        static public string IsOptionalTokenProperty { get { return isOptionalTokenProperty; } }
 
        public string TokenType
        {
            get
            {
                string result;
                return (this.TryGetProperty<string>(TokenTypeProperty, out result)) ? result : null;
            }
            set
            {
                _properties[TokenTypeProperty] = value;
            }
        }
 
        internal bool IsOptionalToken
        {
            get
            {
                bool result;
                return (this.TryGetProperty<bool>(IsOptionalTokenProperty, out result)) ? result : defaultIsOptionalToken;
            }
            set
            {
                _properties[IsOptionalTokenProperty] = value;
            }
        }
 
        public bool RequireCryptographicToken
        {
            get
            {
                bool result;
                return (this.TryGetProperty<bool>(RequireCryptographicTokenProperty, out result)) ? result : defaultRequireCryptographicToken;
            }
            set
            {
                _properties[RequireCryptographicTokenProperty] = (object)value;
            }
        }
 
        public SecurityKeyUsage KeyUsage
        {
            get
            {
                SecurityKeyUsage result;
                return (this.TryGetProperty<SecurityKeyUsage>(KeyUsageProperty, out result)) ? result : defaultKeyUsage;
            }
            set
            {
                SecurityKeyUsageHelper.Validate(value);
                _properties[KeyUsageProperty] = (object)value;
            }
        }
 
        public SecurityKeyType KeyType
        {
            get
            {
                SecurityKeyType result;
                return (this.TryGetProperty<SecurityKeyType>(KeyTypeProperty, out result)) ? result : defaultKeyType;
            }
            set
            {
                SecurityKeyTypeHelper.Validate(value);
                _properties[KeyTypeProperty] = (object)value;
            }
        }
 
        public int KeySize
        {
            get
            {
                int result;
                return (this.TryGetProperty<int>(KeySizeProperty, out result)) ? result : defaultKeySize;
            }
            set
            {
                if (value < 0)
                {
                    throw Fx.Exception.ArgumentOutOfRange("value", value, SRServiceModel.ValueMustBeNonNegative);
                }
                this.Properties[KeySizeProperty] = value;
            }
        }
 
        public IDictionary<string, object> Properties
        {
            get
            {
                return _properties;
            }
        }
 
        private void Initialize()
        {
            this.KeyType = defaultKeyType;
            this.KeyUsage = defaultKeyUsage;
            this.RequireCryptographicToken = defaultRequireCryptographicToken;
            this.KeySize = defaultKeySize;
            this.IsOptionalToken = defaultIsOptionalToken;
        }
 
        public TValue GetProperty<TValue>(string propertyName)
        {
            TValue result;
            if (!TryGetProperty<TValue>(propertyName, out result))
            {
                throw Fx.Exception.Argument(propertyName, string.Format(SRServiceModel.SecurityTokenRequirementDoesNotContainProperty, propertyName));
            }
            return result;
        }
 
        public bool TryGetProperty<TValue>(string propertyName, out TValue result)
        {
            object dictionaryValue;
            if (!Properties.TryGetValue(propertyName, out dictionaryValue))
            {
                result = default(TValue);
                return false;
            }
            if (dictionaryValue != null && !typeof(TValue).IsAssignableFrom(dictionaryValue.GetType()))
            {
                throw Fx.Exception.Argument(propertyName, string.Format(SRServiceModel.SecurityTokenRequirementHasInvalidTypeForProperty, propertyName, dictionaryValue.GetType(), typeof(TValue)));
            }
            result = (TValue)dictionaryValue;
            return true;
        }
    }
}