Пример #1
0
        /// <summary>
        /// Gera um Token nsc:1:
        /// </summary>
        /// <param name="info">dados do usuário NSCInfo</param>
        /// <param name="tokenGuid">saída da GUID gerada (Session ID)</param>
        /// <returns>string nsc:1: contendo o token</returns>
        public static string GenerateToken(NSCInfo info, out Guid tokenGuid)
        {
            Guid token = Guid.NewGuid();

            byte[] bNscInfo;
            byte[] bGuidToken = token.ToByteArray();

            using (MemoryStream ms = new MemoryStream())
            {
                TypeSerializer.SerializeToStream <NSCInfo>(info, ms);
                bNscInfo = ms.ToArray();
            }

            byte[] bHmacMsg = NSC_BYTES.Concat(BitConverter.GetBytes(NSC_VERSION_1)).Concat(bGuidToken).Concat(bNscInfo).ToArray();

            HMACSHA512 hmac = new HMACSHA512(NimbusConfig.CookieHMACKey);

            hmac.ComputeHash(bHmacMsg);

            string b64info  = Convert.ToBase64String(bNscInfo);
            string b64token = Convert.ToBase64String(bGuidToken);
            string b64hmac  = Convert.ToBase64String(hmac.Hash);


            StringBuilder sb = new StringBuilder();

            sb.Append("nsc:"); sb.Append(NSC_VERSION_1.ToString()); sb.Append(':');
            sb.Append(b64token); sb.Append(':');
            sb.Append(b64info); sb.Append(':');
            sb.Append(b64hmac);


            tokenGuid = token;
            return(sb.ToString());
        }
Пример #2
0
        /// <summary>
        /// Verifica Token de autenticação (nsc:1:)
        /// </summary>
        /// <param name="token">string do token nsc:1:</param>
        /// <param name="tokenGuid">saída contendo a GUID do token (Session ID)</param>
        /// <param name="info">saída contendo NSCInfo com dados do usuário</param>
        /// <returns></returns>
        public static bool VerifyToken(string token, out Guid tokenGuid, out NSCInfo info)
        {
            tokenGuid = Guid.Empty;
            info      = null;

            string[] splitToken = token.Split(':');
            try
            {
                // Verifica condições
                // Token começa com nsc
                if (splitToken[0] != "nsc")
                {
                    return(false);
                }

                // Para token versão 1:
                if (splitToken[1] == "1")
                {
                    int nscVersion = 1;
                    //obtem as partes
                    byte[] bToken = Convert.FromBase64String(splitToken[2]);
                    byte[] bInfo  = Convert.FromBase64String(splitToken[3]);
                    byte[] bHmac  = Convert.FromBase64String(splitToken[4]);

                    IEnumerable <byte> bHmacMsg = NSC_BYTES.Concat(BitConverter.GetBytes(nscVersion)).Concat(bToken).Concat(bInfo);

                    //calcula HMAC
                    HMACSHA512 hmac = new HMACSHA512(NimbusConfig.CookieHMACKey);
                    hmac.ComputeHash(bHmacMsg.ToArray());

                    //se HMACs baterem, token é valido
                    if (bHmac.SequenceEqual(hmac.Hash))
                    {
                        //desserializa informações
                        Guid    t = new Guid(bToken);
                        NSCInfo i;
                        using (MemoryStream ms = new MemoryStream())
                        {
                            ms.Write(bInfo, 0, bInfo.Length);
                            ms.Seek(0, SeekOrigin.Begin);
                            i = TypeSerializer.DeserializeFromStream <NSCInfo>(ms);
                        }
                        tokenGuid = t;
                        info      = i;
                        return(true);
                    }
                }
                else
                {
                    return(false);
                }
            }
            catch (Exception ex) { return(false); }

            return(false);
        }