AddAuthentication和SimpleInjector

时间:2018-04-05 00:34:27

标签: c# asp.net-core

我正在解决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()

任何指导都会很棒。谢谢!

1 个答案:

答案 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 =>