我正在对ASP.NET Core Web-API项目中的身份验证问题进行故障排除,并且我想查看在使用SimpleInjector
作为选择的DI框架方面是否缺少某些内容。
OP更新
我最初怀疑这不是SimpleInjector
的问题。交叉布线的东西正在工作,而问题出在OpenIdConnect
东西。
Microsoft将身份验证配置从中间件移到了服务。因此,您现在添加如下代码来配置Auth内容:
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "https://identityserver.staging.blabla.org";
options.ClientId = "someweirdstring";
options.ClientSecret = "someweirderstring";
options.ResponseType = OpenIdConnectResponseType.Token;
options.CallbackPath = "/";
options.SaveTokens = true;
options.Scope.Clear();
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
options.Scope.Add("offline_access");
options.Scope.Add("api");
options.Events = new OpenIdConnectEvents
{
OnTicketReceived = e =>
{
var ctx = e;
//ClaimsPrincipal p = TransformClaims(e.Ticket.Principal);
//e.Ticket = new AuthenticationTicket(
// p,
// e.Ticket.Properties,
// e.Ticket.AuthenticationScheme);
return Task.CompletedTask;
}
};
})
.AddCookie();
然后,将其添加到中间件管道中。
我正在解决的问题是,当我在标头中激发带有有效令牌的http请求时,这似乎无效。
OnTicketReceived
事件根本不触发。我突然意识到我可能应该添加一些代码,以使用
SimpleInjector
进行连接。但是如何?我已经使用
CrossWire
功能自动连接了一些AspNetCore功能:services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IControllerActivator>(new SimpleInjectorControllerActivator(container));
services.AddSingleton<IViewComponentActivator>(new SimpleInjectorViewComponentActivator(container));
services.EnableSimpleInjectorCrossWiring(container);
services.UseSimpleInjectorAspNetRequestScoping(container);
而且我尝试将以下行添加为长距离链接以连接
AuthenticationService
:container.Register<IAuthenticationService, AuthenticationService>();
但是否则,我有点茫然。通过将
AddAuthentication
方法中的内容抽象化,我不知道AuthenticationService
是如何与第3方容器(如果有的话)连接起来的。而且正如顶部所述,我什至不能100%地确定问题是我使用
SimpleInjector
的方式。但是,如果我在方法中添加
Authorize
属性,则会抛出一个异常,该异常表示:InvalidOperationException:未指定authenticationScheme,并且没有找到DefaultChallengeScheme。
Microsoft.AspNetCore.Authentication.AuthenticationService + d__11.MoveNext()
任何指导都会很棒。谢谢!
最佳答案
替换此行代码.AddOpenIdConnect("oidc", options =>
与....AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
...应该解决异常。
如果我做对了,您可能会遇到另一个例外:
System.InvalidOperationException:IDX10803:无法从...获取配置
如果是这种情况,添加cookie即可解决。
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme) // Add this line
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
关于c# - AddAuthentication和SimpleInjector,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49662430/