我正在解决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
是如何与第三方容器(如果有的话)连接的。
正如在顶部所述,我甚至不能100%确定问题是我使用SimpleInjector
的方式。
但是,如果我向方法添加Authorize
属性,则会出现一个异常,其中包含:
InvalidOperationException:未指定authenticationScheme,并且&gt;没有找到DefaultChallengeScheme。 Microsoft.AspNetCore.Authentication.AuthenticationService + d__11.MoveNext()
任何指导都会很棒。谢谢!
答案 0 :(得分:2)
替换此行代码
.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 =>