예제 #1
0
        public virtual string GetFormEncodedQueryFormat(OAuthMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }
            System.Text.StringBuilder strBuilder = new System.Text.StringBuilder();
            bool skipDelimiter = true;

            foreach (string key in message.Parameters.Keys)
            {
                if (message.Parameters[key] != null)
                {
                    if (!skipDelimiter)
                    {
                        strBuilder.Append("&");
                    }
                    strBuilder.Append(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}={1}", new object[]
                    {
                        HttpUtility.UrlEncode(key),
                        HttpUtility.UrlEncode(message.Parameters[key])
                    }));
                    skipDelimiter = false;
                }
            }
            return(strBuilder.ToString());
        }
예제 #2
0
        /// <summary>
        /// Generates a Uri to redirect the user's browser to, along with some OAuth paramters in the query string.
        /// </summary>
        /// <param name="message">The incoming request message.</param>
        /// <param name="authorizationCode">The authorization code.</param>
        /// <returns>The redirect Uri.</returns>
        public static string GetCodeResponseUri(this OAuthMessage message, string authorizationCode)
        {
            string state;

            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            string redirectUri = message.Parameters[OAuthConstants.RedirectUri];

            if (redirectUri == null && message.Parameters[OAuthConstants.GrantType] != OAuthConstants.AccessGrantType.ClientCredentials)
            {
                throw new InvalidOperationException(OAuthConstants.RedirectUri + " cannot be null");
            }

            NameValueCollection responseParameters = new NameValueCollection();

            responseParameters.Add(OAuthConstants.Code, authorizationCode);
            state = message.Parameters[OAuthConstants.State];
            if (state != null)
            {
                responseParameters.Add(OAuthConstants.State, state);
            }

            return(redirectUri + CreateQueryString(responseParameters));
        }
예제 #3
0
        public virtual void Write(OAuthMessage message, System.IO.Stream requestStream)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }
            if (requestStream == null)
            {
                throw new ArgumentNullException("requestStream");
            }

            System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(requestStream);
            AccessTokenRequest     atRequestMsg = message as AccessTokenRequest;

            if (atRequestMsg != null)
            {
                streamWriter.Write(this.GetFormEncodedQueryFormat(message));
                streamWriter.Flush();
                return;
            }

            AccessTokenResponse atResponseMsg = message as AccessTokenResponse;

            if (atResponseMsg != null)
            {
                streamWriter.Write(this.GetJsonEncodedFormat(message));
                streamWriter.Flush();
                return;
            }

            throw new OAuthMessageException(string.Format(Resources.ID3724, message.GetType()));
        }
예제 #4
0
        public virtual string GetJsonEncodedFormat(OAuthMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            var serializedMessage = JsonConvert.SerializeObject(message.Parameters);

            // TODO: replace token of array to object...
            return(serializedMessage);
        }
예제 #5
0
        public virtual string GetQueryStringFormat(OAuthMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            System.Text.StringBuilder strBuilder = new System.Text.StringBuilder();
            strBuilder.Append(message.BaseUri.AbsoluteUri);
            strBuilder.Append("?");
            strBuilder.Append(this.GetFormEncodedQueryFormat(message));
            return(strBuilder.ToString());
        }
예제 #6
0
        public virtual void Write(OAuthMessage message, HttpWebRequest request)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            request.Method      = this.GetHttpMethod(message);
            request.ContentType = this.GetHttpContentType(message);
            this.Write(message, request.GetRequestStream());
        }
예제 #7
0
        public virtual void Write(OAuthMessage message, HttpContextBase context)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            context.Response.ContentType = this.GetHttpContentType(message);
            context.Response.Clear();
            this.Write(message, context.Response.OutputStream);
            context.Response.Flush();
        }
예제 #8
0
        protected virtual OAuthMessage CreateTypedOAuthMessageFromParameters(Uri baseUri, NameValueCollection parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException("parameters");
            }

            OAuthMessage request = null;

            if (parameters["response_type"] == "code" || parameters["response_type"] == "token")
            {
                request = new EndUserAuthorizationRequest(baseUri);
            }
            if (!string.IsNullOrEmpty(parameters["code"]) || (!string.IsNullOrEmpty(parameters["access_token"]) && string.IsNullOrEmpty(parameters["refresh_token"])))
            {
                request = new EndUserAuthorizationResponse(baseUri);
            }
            if (!string.IsNullOrEmpty(parameters["error"]))
            {
                request = new EndUserAuthorizationFailedResponse(baseUri);
            }
            if (!string.IsNullOrEmpty(parameters["grant_type"]) && parameters["grant_type"] == "authorization_code")
            {
                request = new AccessTokenRequestWithAuthorizationCode(baseUri);
            }
            if (!string.IsNullOrEmpty(parameters["grant_type"]) && parameters["grant_type"] == OAuthConstants.AccessGrantType.ClientCredentials)
            {
                request = new AccessTokenRequest(baseUri);
            }
            if (!string.IsNullOrEmpty(parameters["access_token"]))
            {
                request = new AccessTokenResponse(baseUri);
            }
            if (request == null)
            {
                throw new OAuthMessageSerializationException(Resources.ID3723);
            }

            request.Parameters.Add(parameters);
            request.Validate();
            return(request);
        }
예제 #9
0
        public virtual string GetHttpContentType(OAuthMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            AccessTokenRequest atRequestMessage = message as AccessTokenRequest;

            if (atRequestMessage != null)
            {
                return("application/x-www-form-urlencoded");
            }

            AccessTokenResponse atResponseMessage = message as AccessTokenResponse;

            if (atResponseMessage != null)
            {
                return("application/json");
            }
            return("text/plain; charset=us-ascii");
        }
예제 #10
0
        /// <summary>
        /// Generates a Uri with the error message in the query string.
        /// </summary>
        /// <param name="message">Then incoming request message.</param>
        /// <param name="errorCode">The error code.</param>
        /// <param name="errorDescription">A description of the error.</param>
        /// <returns>
        /// Returns the redirect Uri.
        /// </returns>
        public static string GetErrorResponseUri(this OAuthMessage message, string errorCode, string errorDescription)
        {
            string state;

            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            if (errorCode == null)
            {
                throw new ArgumentNullException("errorCode");
            }

            if (errorDescription == null)
            {
                throw new ArgumentNullException("errorDescription");
            }

            string redirectUri = message.Parameters[OAuthConstants.RedirectUri];

            if (redirectUri == null)
            {
                throw new InvalidOperationException(OAuthConstants.RedirectUri + " cannot be null");
            }

            NameValueCollection responseParameters = new NameValueCollection();

            responseParameters.Add(OAuthConstants.Error, errorCode);
            responseParameters.Add(OAuthConstants.ErrorDescription, errorDescription);
            state = message.Parameters[OAuthConstants.State];
            if (state != null)
            {
                responseParameters.Add(OAuthConstants.State, state);
            }

            return(redirectUri + CreateQueryString(responseParameters));
        }
예제 #11
0
        public virtual string GetHttpMethod(OAuthMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            AccessTokenRequest atRequestMessage = message as AccessTokenRequest;

            if (atRequestMessage != null)
            {
                return("POST");
            }

            AccessTokenResponse atResponseMessage = message as AccessTokenResponse;

            if (atResponseMessage != null)
            {
                return("POST");
            }

            return("GET");
        }