File: System\IdentityModel\Protocols\WSTrust\RequestSecurityToken.cs
Project: ndp\cdf\src\WCF\IdentityModel\System.IdentityModel.csproj (System.IdentityModel)
//-----------------------------------------------------------------------
// <copyright file="RequestSecurityToken.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//-----------------------------------------------------------------------
 
namespace System.IdentityModel.Protocols.WSTrust
{
    using System.IdentityModel.Tokens;
    using System.IdentityModel.Configuration;
 
    /// <summary>
    /// The class defines the wst:RequestSecurityToken element which 
    /// is used to request a security token.
    /// </summary>
    public class RequestSecurityToken : WSTrustMessage
    {
        AdditionalContext _additionalContext;
        RequestClaimCollection _claims;
        string _computedKeyAlgorithm;
        Renewing _renewing;
        SecurityTokenElement _renewTarget;
        SecurityTokenElement _proofEncryption;
        RequestSecurityToken _secondaryParameters;
        SecurityTokenElement _onBehalfOf;
        EndpointReference _onBehalfOfIssuer;
        SecurityTokenElement _actAs;
        SecurityTokenElement _delegateTo;
        bool? _forwardable;
        bool? _delegatable;
        SecurityTokenElement _cancelTarget;
        SecurityTokenElement _validateTarget;
        Participants _participants;
        SecurityTokenElement _encryption;
 
        /// <summary>
        /// This constructor is usually used on the receiving end.
        /// </summary>
        public RequestSecurityToken()
            : this(null, null)
        {
        }
 
        /// <summary>
        /// This constructor is usually used on the sending side to instantiate a
        /// instance of RST based on the request type and its string value.
        /// </summary>
        public RequestSecurityToken(string requestType)
            : this(requestType, null)
        {
        }
 
        /// <summary>
        /// This constructor is usually used on the sending side to instantiate a
        /// instance of RST based on the request type and its string value.
        /// </summary>
        public RequestSecurityToken(string requestType, string keyType)
            : base()
        {
            RequestType = requestType;
 
            if (keyType == KeyTypes.Symmetric)
            {
                Entropy = new Entropy(SecurityTokenServiceConfiguration.DefaultKeySizeInBitsConstant);
                KeySizeInBits = SecurityTokenServiceConfiguration.DefaultKeySizeInBitsConstant;
            }
            else if (keyType == KeyTypes.Bearer)
            {
                KeySizeInBits = 0;
            }
            else if (keyType == KeyTypes.Asymmetric)
            {
                KeySizeInBits = 1024;
            }
 
            KeyType = keyType;
        }
 
        /// <summary>
        /// The optional element requests a specific set of claim types requested by the client.
        /// </summary>
        public RequestClaimCollection Claims
        {
            get
            {
                if (_claims == null)
                {
                    _claims = new RequestClaimCollection();
                }
 
                return _claims;
            }
        }
 
        /// <summary>
        /// The optional element provides that provides information on the token/key to use when encrypting
        /// </summary>
        public SecurityTokenElement Encryption
        {
            get
            {
                return _encryption;
            }
 
            set
            {
                _encryption = value;
            }
        }
 
        /// <summary>
        /// This optional URI element indicates the desired algorithm to use when computed
        /// key are used for issued tokens.
        /// </summary>
        /// <remarks>
        /// This is an extension to the RequestSecurityToken element.
        /// </remarks>
        /// <devdocs>
        ///  It is defined in the section 11.2 in the WS-Trust spec.
        /// </devdocs>
        public string ComputedKeyAlgorithm
        {
            get
            {
                return _computedKeyAlgorithm;
            }
 
            set
            {
                _computedKeyAlgorithm = value;
            }
        }
 
        /// <summary>
        /// Gets or Sets a boolean that specifies if the returned token should
        /// be delegatable.
        /// </summary>
        public bool? Delegatable
        {
            get
            {
                return _delegatable;
            }
 
            set
            {
                _delegatable = value;
            }
        }
 
        /// <summary>
        /// Gets or Sets the Identity to which the Issued Token is delegated to.
        /// </summary>
        public SecurityTokenElement DelegateTo
        {
            get
            {
                return _delegateTo;
            }
 
            set
            {
                _delegateTo = value;
            }
        }
 
        /// <summary>
        /// Gets or Sets a boolean that specifies if the Issued Token should
        /// be marked forwardable.
        /// </summary>
        public bool? Forwardable
        {
            get
            {
                return _forwardable;
            }
 
            set
            {
                _forwardable = value;
            }
        }
 
        /// <summary>
        /// This optional element indicates that the requestor is making the request 
        /// on behalf of another.
        /// </summary>
        public SecurityTokenElement OnBehalfOf
        {
            get
            {
                return _onBehalfOf;
            }
 
            set
            {
                _onBehalfOf = value;
            }
        }
 
        /// <summary>
        /// Gets or Sets the Participants who are authorized to use
        /// the issued token.
        /// </summary>
        public Participants Participants
        {
            get
            {
                return _participants;
            }
 
            set
            {
                _participants = value;
            }
        }
 
        /// <summary>
        /// Gets/Sets the Issuer of the OnBehalfOf token.
        /// </summary>
        public EndpointReference Issuer
        {
            get
            {
                return _onBehalfOfIssuer;
            }
 
            set
            {
                _onBehalfOfIssuer = value;
            }
        }
 
        /// <summary>
        /// This is a optional element that provides additional information
        /// for authorization decision.
        /// </summary>
        public AdditionalContext AdditionalContext
        {
            get
            {
                return _additionalContext;
            }
 
            set
            {
                _additionalContext = value;
            }
        }
 
        /// <summary>
        /// This optional element indicates that the requestor is making the request 
        /// on to act as another.
        /// </summary>
        public SecurityTokenElement ActAs
        {
            get
            {
                return _actAs;
            }
 
            set
            {
                _actAs = value;
            }
        }
 
        /// <summary>
        /// Gets or Sets the Token that is requested to be cancelled.
        /// </summary>
        public SecurityTokenElement CancelTarget
        {
            get
            {
                return _cancelTarget;
            }
 
            set
            {
                _cancelTarget = value;
            }
        }
 
        /// <summary>
        /// Gets or sets the SecurityToken to be used to encrypt the proof token.
        /// </summary>
        public SecurityTokenElement ProofEncryption
        {
            get
            {
                return _proofEncryption;
            }
 
            set
            {
                _proofEncryption = value;
            }
        }
 
        /// <summary>
        /// Gets or sets the Renewing element inside the RequestSecurityToken message.
        /// </summary>
        public Renewing Renewing
        {
            get
            {
                return _renewing;
            }
 
            set
            {
                _renewing = value;
            }
        }
 
        /// <summary>
        /// Gets or sets the RenewTarget element inside the RequestSecurityToken message.
        /// </summary>
        public SecurityTokenElement RenewTarget
        {
            get
            {
                return _renewTarget;
            }
 
            set
            {
                _renewTarget = value;
            }
        }
 
        /// <summary>
        /// Gets or sets the SecondaryParameters inside the RequestSecurityToken message.
        /// This represents the information for which the requestor is not the orginator. The STS MAY choose to use values found here.
        /// </summary>
        public RequestSecurityToken SecondaryParameters
        {
            get
            {
                return _secondaryParameters;
            }
 
            set
            {
                _secondaryParameters = value;
            }
        }
 
        /// <summary>
        /// Gets or Sets the Security Token to be Validated.
        /// </summary>
        public SecurityTokenElement ValidateTarget
        {
            get
            {
                return _validateTarget;
            }
 
            set
            {
                _validateTarget = value;
            }
        }
    }
}