public static string GetAuthorizeUrl(this IdentityServerHost host, string client_id = null, string redirect_uri = null, string scope = null, string response_type = null, string state = null, string nonce = null)
        {
            var disco = host.GetDiscoveryDocument();

            disco["authorization_endpoint"].Should().NotBeNull();
            disco["response_types_supported"].Should().NotBeNull();
            var arr    = (JArray)disco["response_types_supported"];
            var values = arr.Select(x => x.ToString());

            values.Should().Contain("code");

            var url = disco["authorization_endpoint"].ToString();

            var query = "";

            if (response_type.IsPresent())
            {
                query += "&response_type=" + HttpUtility.UrlEncode(response_type);
            }
            if (scope.IsPresent())
            {
                query += "&scope=" + HttpUtility.UrlEncode(scope);
            }
            if (client_id.IsPresent())
            {
                query += "&client_id=" + HttpUtility.UrlEncode(client_id);
            }
            if (redirect_uri.IsPresent())
            {
                query += "&redirect_uri=" + HttpUtility.UrlEncode(redirect_uri);
            }
            if (state.IsPresent())
            {
                query += "&state=" + HttpUtility.UrlEncode(state);
            }
            if (nonce.IsPresent())
            {
                query += "&nonce=" + HttpUtility.UrlEncode(nonce);
            }

            if (query.StartsWith("&"))
            {
                url += "?" + query.Substring(1);
            }

            return(url);
        }
        public static X509Certificate2 GetSigningCertificate(this IdentityServerHost host)
        {
            var meta = host.GetDiscoveryDocument();

            meta["jwks_uri"].Should().NotBeNull();
            var jwks = meta["jwks_uri"].ToString();

            var result = host.Client.GetAsync(jwks).Result;

            result.StatusCode.Should().Be(HttpStatusCode.OK);
            result.Content.Headers.ContentType.MediaType.Should().Be("application/json");

            var json = result.Content.ReadAsStringAsync().Result;
            var data = JObject.Parse(json);

            data["keys"].Should().NotBeNull();

            var keys = (JArray)data["keys"];
            var rsa  = keys.FirstOrDefault(x => (string)x["kty"] == "RSA" && (string)x["use"] == "sig");

            rsa.Should().NotBeNull();

            var certs = (JArray)rsa["x5c"];

            certs.Should().NotBeNull();

            var cert = (string)certs.First();

            cert.Should().NotBeNull();

            var bytes = Convert.FromBase64String(cert);
            var ret   = new X509Certificate2(bytes);

            ret.Should().NotBeNull();

            return(ret);
        }