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; using Owin.Security.Providers.Properties; namespace Owin.Security.Providers.LinkedIn { public class LinkedInAuthenticationMiddleware : AuthenticationMiddleware { private readonly HttpClient httpClient; private readonly ILogger logger; public LinkedInAuthenticationMiddleware(OwinMiddleware next, IAppBuilder app, LinkedInAuthenticationOptions options) : base(next, options) { 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 LinkedInAuthenticationProvider(); if (Options.StateDataFormat == null) { IDataProtector dataProtector = app.CreateDataProtector( typeof (LinkedInAuthenticationMiddleware).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 LinkedInAuthenticationHandler(httpClient, logger); } private HttpMessageHandler ResolveHttpMessageHandler(LinkedInAuthenticationOptions options) { HttpMessageHandler handler = options.BackchannelHttpHandler ?? new WebRequestHandler(); // If they provided a validator, apply it or fail. if (options.BackchannelCertificateValidator != null) { // 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; } } }