将身份验证从 dotnet core 1.1 迁移到 dotnet core 2.0
Migrating Authentication from dotnet core 1.1 to dotnet core 2.0
我们刚刚将身份验证中间件从 .net core 1.1 迁移到 .net core 2.0,遵循 答案中的示例。但是,当我尝试发出请求时(即使尝试访问 Swagger UI),一切都会构建并运行,我在名为 UserAuthHandler
的自定义 AuthenticationHandler
上收到以下异常:
System.InvalidOperationException: A suitable constructor for type 'BrokerAPI.AuthMiddleware.UserAuthHandler' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.
来自 UserAuthHandler
的代码:
public class UserAuthHandler : AuthenticationHandler<UserAuthAuthenticationOptions>
{
protected UserAuthHandler(IOptionsMonitor<UserAuthAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
{
}
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
//handle authentication
var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity),
new AuthenticationProperties(), "UserAuth");
return Task.FromResult(AuthenticateResult.Success(ticket));
}
}
来自 UserAuthExtensions
的代码:
public static class UserAuthExtensions
{
public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<UserAuthAuthenticationOptions> configureOptions)
{
return builder.AddScheme<UserAuthAuthenticationOptions, UserAuthHandler>("UserAuth", "UserAuth", configureOptions);
}
}
我如何调用 Startup.cs
中的所有内容:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = "UserAuth";
}).AddCustomAuth(o => { });
}
public void Configure()
{
app.UseAuthentication();
}
我搜索了 Google 示例和有类似问题的人,但无济于事。
我是否遗漏了与我的 DI 容器相关的内容?或者它通常与 .net core 2 中的身份验证有关?
提前致谢。
异常消息实际上非常清楚:您的处理程序有一个受保护的构造函数,不能被依赖注入系统使用。使其成为 public,它应该可以工作:
public class UserAuthHandler : AuthenticationHandler<UserAuthAuthenticationOptions>
{
public UserAuthHandler(IOptionsMonitor<UserAuthAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
{
}
}
我们刚刚将身份验证中间件从 .net core 1.1 迁移到 .net core 2.0,遵循 UserAuthHandler
的自定义 AuthenticationHandler
上收到以下异常:
System.InvalidOperationException: A suitable constructor for type 'BrokerAPI.AuthMiddleware.UserAuthHandler' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.
来自 UserAuthHandler
的代码:
public class UserAuthHandler : AuthenticationHandler<UserAuthAuthenticationOptions>
{
protected UserAuthHandler(IOptionsMonitor<UserAuthAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
{
}
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
//handle authentication
var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity),
new AuthenticationProperties(), "UserAuth");
return Task.FromResult(AuthenticateResult.Success(ticket));
}
}
来自 UserAuthExtensions
的代码:
public static class UserAuthExtensions
{
public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<UserAuthAuthenticationOptions> configureOptions)
{
return builder.AddScheme<UserAuthAuthenticationOptions, UserAuthHandler>("UserAuth", "UserAuth", configureOptions);
}
}
我如何调用 Startup.cs
中的所有内容:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = "UserAuth";
}).AddCustomAuth(o => { });
}
public void Configure()
{
app.UseAuthentication();
}
我搜索了 Google 示例和有类似问题的人,但无济于事。
我是否遗漏了与我的 DI 容器相关的内容?或者它通常与 .net core 2 中的身份验证有关?
提前致谢。
异常消息实际上非常清楚:您的处理程序有一个受保护的构造函数,不能被依赖注入系统使用。使其成为 public,它应该可以工作:
public class UserAuthHandler : AuthenticationHandler<UserAuthAuthenticationOptions>
{
public UserAuthHandler(IOptionsMonitor<UserAuthAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
{
}
}