using System; using System.Globalization; using System.Net.Http; using Microsoft.Owin; using Microsoft.Owin.Logging; using Microsoft.Owin.Security; using Microsoft.Owin.Security.DataHandler; using Microsoft.Owin.Security.DataProtection; using Microsoft.Owin.Security.Infrastructure; namespace Owin.Security.Providers.ArcGISPortal { public class ArcGISPortalAuthenticationMiddleware : AuthenticationMiddleware { private readonly HttpClient _httpClient; private readonly ILogger _logger; public ArcGISPortalAuthenticationMiddleware(OwinMiddleware next, IAppBuilder app, ArcGISPortalAuthenticationOptions options) : base(next, options) { if (string.IsNullOrWhiteSpace(Options.Host)) throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.Exception_OptionMustBeProvided, "Host")); if (string.IsNullOrWhiteSpace(Options.ClientId)) throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.Exception_OptionMustBeProvided, "ClientId")); if (string.IsNullOrWhiteSpace(Options.ClientSecret)) throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.Exception_OptionMustBeProvided, "ClientSecret")); _logger = app.CreateLogger(); if (Options.Provider == null) Options.Provider = new ArcGISPortalAuthenticationProvider(); if (Options.StateDataFormat == null) { var dataProtector = app.CreateDataProtector( typeof(ArcGISPortalAuthenticationMiddleware).FullName, Options.AuthenticationType, "v2"); Options.StateDataFormat = new PropertiesDataFormat(dataProtector); } if (string.IsNullOrEmpty(Options.SignInAsAuthenticationType)) Options.SignInAsAuthenticationType = app.GetDefaultSignInAsAuthenticationType(); _httpClient = new HttpClient(ResolveHttpMessageHandler(Options)) { Timeout = Options.BackchannelTimeout, MaxResponseContentBufferSize = 1024 * 1024 * 10, }; _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Microsoft Owin ArcGISPortal middleware"); _httpClient.DefaultRequestHeaders.ExpectContinue = false; } /// /// Provides the object for processing /// authentication-related requests. /// /// /// An configured with the /// supplied to the constructor. /// protected override AuthenticationHandler CreateHandler() { return new ArcGISPortalAuthenticationHandler(_httpClient, _logger, Options.Host); } private static HttpMessageHandler ResolveHttpMessageHandler(ArcGISPortalAuthenticationOptions options) { var handler = options.BackchannelHttpHandler ?? new WebRequestHandler(); // If they provided a validator, apply it or fail. if (options.BackchannelCertificateValidator == null) return handler; // Set the cert validate callback var webRequestHandler = handler as WebRequestHandler; if (webRequestHandler == null) { throw new InvalidOperationException(Resources.Exception_ValidatorHandlerMismatch); } webRequestHandler.ServerCertificateValidationCallback = options.BackchannelCertificateValidator.Validate; return handler; } } }