Skip to content

Instantly share code, notes, and snippets.

@johnkors
Last active February 7, 2017 13:23
Show Gist options
  • Save johnkors/b6080c0281361f2301caf918621e4060 to your computer and use it in GitHub Desktop.
Save johnkors/b6080c0281361f2301caf918621e4060 to your computer and use it in GitHub Desktop.
Create discourse URL response
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