using Microsoft.AspNet.Http; using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace OAuth.AspNet.AuthServer { /// /// Data object representing the information contained in the query string of an Authorize endpoint request. /// public class AuthorizeEndpointRequest { /// /// Creates a new instance populated with values from the query string parameters. /// /// Query string parameters from a request. public AuthorizeEndpointRequest(IReadableStringCollection parameters) { if (parameters == null) { throw new ArgumentNullException("parameters"); } Scope = new List(); foreach (var parameter in parameters) { AddParameter(parameter.Key, parameters[parameter.Key]); } } /// /// The "response_type" query string parameter of the Authorize request. Known values are "code" and "token". /// public string ResponseType { get; set; } /// /// The "response_mode" query string parameter of the Authorize request. Known values are "query", "fragment" and "form_post" /// See also, http://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html /// public string ResponseMode { get; set; } /// /// The "client_id" query string parameter of the Authorize request. /// public string ClientId { get; set; } /// /// The "redirect_uri" query string parameter of the Authorize request. May be absent if the server should use the /// redirect uri known to be registered to the client id. /// [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "By design")] public string RedirectUri { get; set; } /// /// The "scope" query string parameter of the Authorize request. May be absent if the server should use default scopes. /// public IList Scope { get; private set; } /// /// The "scope" query string parameter of the Authorize request. May be absent if the client does not require state to be /// included when returning to the RedirectUri. /// public string State { get; set; } /// /// True if the "response_type" query string parameter is "code". /// See also, http://tools.ietf.org/html/rfc6749#section-4.1.1 /// public bool IsAuthorizationCodeGrantType { get { return ContainsGrantType(Constants.ResponseTypes.Code); } } /// /// True if the "response_type" query string parameter is "token". /// See also, http://tools.ietf.org/html/rfc6749#section-4.2.1 /// public bool IsImplicitGrantType { get { return ContainsGrantType(Constants.ResponseTypes.Token); } } public bool IsFormPostResponseMode { get { return string.Equals(ResponseMode, Constants.ResponseModes.FormPost, StringComparison.Ordinal); } } /// /// True if the "response_type" query string contains the passed responseType. /// See also, http://openid.net/specs/oauth-v2-multiple-response-types-1_0.html /// /// The responseType that is expected within the "response_type" query string /// True if the "response_type" query string contains the passed responseType. public bool ContainsGrantType(string responseType) { var parts = ResponseType.Split(' '); foreach (var part in parts) { if (string.Equals(part, responseType, StringComparison.Ordinal)) { return true; } } return false; } private void AddParameter(string name, string value) { if (string.Equals(name, Constants.Parameters.ResponseType, StringComparison.Ordinal)) { ResponseType = value; } else if (string.Equals(name, Constants.Parameters.ClientId, StringComparison.Ordinal)) { ClientId = value; } else if (string.Equals(name, Constants.Parameters.RedirectUri, StringComparison.Ordinal)) { RedirectUri = value; } else if (string.Equals(name, Constants.Parameters.Scope, StringComparison.Ordinal)) { Scope = value.Split(' '); } else if (string.Equals(name, Constants.Parameters.State, StringComparison.Ordinal)) { State = value; } else if (string.Equals(name, Constants.Parameters.ResponseMode, StringComparison.Ordinal)) { ResponseMode = value; } } } }