2016-03-19 10 views
4

Ich versuche gerade eine AuthenticationMiddleware zu schreiben. Siehe this answer. Die App baut ohne Fehler, aber wenn ich dnx web ausführen bekomme ich folgende Fehlermeldung:Asp.Net: Kein passender Konstruktor für AuthenticationMiddleware

Unable to locate suitable constructor for type 'Namespace.BasicAuthenticationMiddleware'. Ensure the type is concrete and all parameters are accepted by a constructor.

at Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)

at Microsoft.AspNet.Builder.UseMiddlewareExtensions.<>c__DisplayClass2_0.b__0(RequestDelegate next)

at Microsoft.AspNet.Builder.Internal.ApplicationBuilder.Build()

at Microsoft.AspNet.Hosting.Internal.HostingEngine.BuildApplication()

fail: Microsoft.AspNet.Hosting.Internal.HostingEngine[7]

Ich bin sicher, dass die Constructor Unterschrift ich in irgendeiner Weise falsch verwenden, aber ich bin nicht in der Lage eine passende Dokumentation zu finden weil es scheint, als gäbe es Dutzende von veralteten.

Dies ist AuthenticationMiddleware:

public class BasicAuthenticationMiddleware : AuthenticationMiddleware<BasicAuthOptions> 
{ 
    public BasicAuthenticationMiddleware(
     RequestDelegate next, 
     BasicAuthOptions options, 
     ILoggerFactory loggerFactory, 
     IUrlEncoder urlEncoder) 
     : base(next, options, loggerFactory, urlEncoder) {} 

    protected override AuthenticationHandler<BasicAuthOptions> CreateHandler() 
    { 
     return new BasicAuthenticationHandler(); 
    } 
} 

BasicAuthOptions:

public class BasicAuthOptions : AuthenticationOptions { 
    public const string Scheme = "BasicAuth"; 
    public BasicAuthOptions() 
    { 
     AuthenticationScheme = Scheme; 
     AutomaticAuthenticate = true; 
    } 
} 

BasicAuthenticationExtensions

public static class BasicAuthenticationExtensions 
{ 
    public static void UseBasicAuthentication(this IApplicationBuilder builder) { 
     builder.UseMiddleware<BasicAuthenticationMiddleware>(new ConfigureOptions<BasicAuthOptions>(o => new BasicAuthOptions())); 
    } 
} 

Startup.cs:

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     // Set up configuration sources. 
     var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json") 
      .AddEnvironmentVariables(); 
     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; set; } 

    // This method gets called by the runtime. Use this method to add services to the container. 
    public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddMvc(); 

     services.AddAuthorization(options => { 
      options.AddPolicy(BasicAuthOptions.Scheme, policy => policy.Requirements.Add(new BasicAuthRequirement())); 
     }); 
    } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     app.UseIISPlatformHandler(); 

     app.UseStaticFiles(); 

     app.UseBasicAuthentication(); 

     app.UseMvc(); 
    } 

    // Entry point for the application. 
    public static void Main(string[] args) => Microsoft.AspNet.Hosting.WebApplication.Run<Startup>(args); 
} 
+0

Hier ist, wo Sie werfen. https://github.com/aspnet/HttpAbstractions/blob/02363da94eee7311e457e136dc45edf9c5ac3494/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs#L75 –

Antwort

5

Ihre UseBasicAuthentication Erweiterung versucht, eine ConfigureOptions Instanz zu injizieren, die Ihre Middleware nicht als Parameter akzeptiert.

fließen einfach die Optionen Instanz, wie sie ist:

public static class BasicAuthenticationExtensions { 
    public static void UseBasicAuthentication(this IApplicationBuilder builder) { 
     builder.UseMiddleware<BasicAuthenticationMiddleware>(new BasicAuthOptions()); 
    } 
} 
+0

Vielen Dank. Das war die richtige Veränderung, die ich machen musste! :) –