#region 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; #endregion namespace Owin.Security.Providers.Podbean { public class PodbeanAuthenticationMiddleware : AuthenticationMiddleware { private readonly HttpClient _httpClient; private readonly ILogger _logger; public PodbeanAuthenticationMiddleware(OwinMiddleware next, IAppBuilder app, PodbeanAuthenticationOptions options) : base(next, options) { if (string.IsNullOrWhiteSpace(Options.AppId)) throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.Exception_OptionMustBeProvided, "AppId")); if (string.IsNullOrWhiteSpace(Options.AppSecret)) throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.Exception_OptionMustBeProvided, "AppSecret")); _logger = app.CreateLogger(); if (Options.Provider == null) Options.Provider = new PodbeanAuthenticationProvider(); if (Options.StateDataFormat == null) { var dataProtector = app.CreateDataProtector( typeof(PodbeanAuthenticationMiddleware).FullName, Options.AuthenticationType, "v1"); 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 }; } /// /// Provides the object for processing /// authentication-related requests. /// /// /// An configured with the /// supplied to the constructor. /// protected override AuthenticationHandler CreateHandler() { return new PodbeanAuthenticationHandler(_httpClient, _logger); } private static HttpMessageHandler ResolveHttpMessageHandler(PodbeanAuthenticationOptions 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; } } }