Last active
February 7, 2017 13:23
-
-
Save johnkors/b6080c0281361f2301caf918621e4060 to your computer and use it in GitHub Desktop.
Create discourse URL response
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private static string CreateDiscourseRedirectUrl(InMemoryUser user, string originalEncodedsso) | |
{ | |
var urlParameters = Parsesso(originalEncodedsso); | |
var nonce = urlParameters.Get("nonce"); | |
var returnUrl = urlParameters.Get("return_sso_url"); | |
ValidateKnownurl(returnUrl); | |
var ssoDictionary = new Dictionary<string, string> | |
{ | |
{"nonce", nonce}, | |
{"email", HttpUtility.UrlEncode(user.GetClaim("email"))}, | |
{"external_id", HttpUtility.UrlEncode(user.Subject)}, | |
{"username", HttpUtility.UrlEncode(user.Username)}, | |
{"name", HttpUtility.UrlEncode(user.GetClaim("name"))} | |
}; | |
var returnsso = CreatessoQueryString(ssoDictionary); | |
var returnssoEncoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(returnsso)); | |
var returnSig = Hash(DISCOURSE_SECRET, returnssoEncoded); | |
return $"{returnUrl}?sso={returnssoEncoded}&sig={returnSig}"; | |
} | |
private static NameValueCollection Parsesso(string encodedsso) | |
{ | |
var queryString = Encoding.UTF8.GetString(Convert.FromBase64String(encodedsso)); | |
return HttpUtility.ParseQueryString(queryString); | |
} | |
private static string CreatessoQueryString(Dictionary<string, string> dictionary) | |
{ | |
return string.Join("&", dictionary.Select(x => $"{x.Key}={x.Value}")); | |
} | |
private static string Hash(string secret, string encodedPayload) | |
{ | |
var hasher = new HMACSHA256(Encoding.UTF8.GetBytes(secret)); | |
var hash = hasher.ComputeHash(Encoding.UTF8.GetBytes(encodedPayload)); | |
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); | |
} | |
private List<string> ValidRedirectUris = new List<string> | |
{ | |
"http://discourse-test.westeurope.cloudapp.azure.com/session/sso_login" | |
}; | |
private void ValidateKnownurl(string returnUrl) | |
{ | |
if (!ValidRedirectUris.Any(u => u.Equals(returnUrl))) | |
throw new ApplicationException("Bad redirect uri"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment