protected virtual TokenAndExpiration GetTokenNoCache(string serviceNamespace, string acsHostName, string sbHostName, string path)
        {
            var acsEndpoint = "https://" + serviceNamespace + "-sb." + acsHostName + "/WRAPv0.9/";
            var realm       = "http://" + serviceNamespace + "." + sbHostName + path;
            var values      = new Hashtable {
                { "wrap_name", this.issuerName }, { "wrap_password", this.issuerSecret }, { "wrap_scope", realm }
            };
            var responseString     = ExecuteRequest(acsEndpoint, values);
            var responseProperties = responseString.Split('&');
            //var tokenProperty = responseProperties[0].Split('=');

            var tokenAndExpiration = new TokenAndExpiration();

            foreach (var responseProperty in responseProperties)
            {
                var tokenProperty = responseProperty.Split('=');

                if (String.Equals(tokenProperty[0], "wrap_access_token"))
                {
                    tokenAndExpiration.Token = "WRAP access_token=\"" + HttpUtility.UrlDecode(tokenProperty[1]) + "\"";
                }
                else if (String.Equals(tokenProperty[0], "wrap_access_token_expires_in"))
                {
                    uint tokenExpiresIn = Convert.ToUInt32(tokenProperty[1]);
                    tokenAndExpiration.ExpirationTime = DateTime.UtcNow.AddSeconds(tokenExpiresIn - 60); // Treat as expired 60 seconds earlier
                }
            }
            if (tokenAndExpiration.Token == null)
            {
                throw new Exception("Unexpected token format from ACS");
            }

            return(tokenAndExpiration);
        }
Esempio n. 2
0
        protected override TokenAndExpiration GetTokenNoCache(string serviceNamespace, string acsHostName, string sbHostName, string path)
        {
            string uri          = "http://" + serviceNamespace + "." + sbHostName + path;
            var    expiry       = GetExpiry(this.tokenExpiryInSeconds); // Set token lifetime to 20 minutes.
            string stringToSign = HttpUtility.UrlEncode(uri) + "\n" + expiry;

            var    hmac            = SHA.computeHMAC_SHA256(Encoding.UTF8.GetBytes(this.keySecret), Encoding.UTF8.GetBytes(stringToSign));
            string signatureString = Convert.ToBase64String(hmac);

#if MF_FRAMEWORK_VERSION_V4_2
            // Adjust for .NET MF 4.2 character set difference
            signatureString = Base64NetMf42ToRfc4648(signatureString);
#endif

            var tokenAndExpiration = new TokenAndExpiration();

            tokenAndExpiration.ExpirationTime = DateTime.UtcNow.AddSeconds(this.tokenExpiryInSeconds - 60); // Treat as expired 60 seconds earlier

            tokenAndExpiration.Token = "SharedAccessSignature sr=" + HttpUtility.UrlEncode(uri) + "&sig=" + HttpUtility.UrlEncode(signatureString) + "&se=" + expiry + "&skn=" + this.keyName;
            return(tokenAndExpiration);
        }
        public virtual string GetToken(string serviceNamespace, string acsHostName, string sbHostName, string path)
        {
            string tokenCacheKey = serviceNamespace + path;

            if (this.cachedTokens.Contains(tokenCacheKey))
            {
                TokenAndExpiration tokenAndExpiration = (TokenAndExpiration)this.cachedTokens[tokenCacheKey];
                if (tokenAndExpiration.ExpirationTime.CompareTo(DateTime.UtcNow) > 0)
                {
                    return(tokenAndExpiration.Token);
                }
                else
                {
                    this.cachedTokens.Remove(tokenCacheKey);
                }
            }

            var newTokenAndExpiration = GetTokenNoCache(serviceNamespace, acsHostName, sbHostName, path);

            this.cachedTokens.Add(tokenCacheKey, newTokenAndExpiration);

            return(newTokenAndExpiration.Token);
        }