2016-03-19 11 views
4

現在、AuthenticationMiddlewareを作成しようとしています。 this answerを参照してください。アプリはエラーなしでビルドしますが、私はdnx webを実行すると、私は次のエラーを取得する:Asp.Net:適切な認証ミドルウェアのコンストラクタ

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]

私は、私が使用してコンストラクタの署名が何らかの方法で間違っていることを確信しているが、私は、適切なドキュメントを見つけることができないんだけどこれは、廃止予定のものが数多くあるようだからです。

これは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

ここです。 https://github.com/aspnet/HttpAbstractions/blob/02363da94eee7311e457e136dc45edf9c5ac3494/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs#L75 –

答えて

5

UseBasicAuthentication拡張子は、ミドルウェアがパラメータとして受け取らないConfigureOptionsインスタンスを挿入しようとします。

そのまま単純にオプションのインスタンスを流し:あなたが投げている場所

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

ありがとうございました。これは私が必要とした正しい変更でした! :) –

関連する問題