我正在对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/

10-11 00:58