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); }
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); }