private void Parse()
        {
            this.Claims = new NameValueCollection();

            if (RawToken.StartsWith("wrap_access_token="))
            {
                RawToken = RawToken.Replace("wrap_access_token=", "");
            }

            foreach (var rawNameValue in RawToken.Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries))
            {
                if (rawNameValue.StartsWith("HMACSHA256="))
                {
                    continue;
                }

                var nameValue = rawNameValue.Split('=');

                if (nameValue.Length != 2)
                {
                    throw new InvalidSecurityTokenException(string.Format(
                                                                "Invalid token contains a name/value pair missing an = character: '{0}'", rawNameValue));
                }

                var key = HttpUtility.UrlDecode(nameValue[0]);

                if (this.Claims.AllKeys.Contains(key))
                {
                    throw new InvalidSecurityTokenException("Duplicated name token.");
                }

                var values = HttpUtility.UrlDecode(nameValue[1]);

                switch (key)
                {
                case Saml2Constants.Elements.Audience:
                    this.Audience = values;
                    break;

                case "ExpiresOn":
                    this.ExpiresOn = ulong.Parse(values).ToDateTimeFromEpoch();
                    break;

                case Saml2Constants.Elements.Issuer:
                    this.Issuer = values;
                    break;

                default:
                    foreach (var value in values.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
                    {
                        this.Claims.Add(key, value);
                    }
                    break;
                }
            }
        }