ASP .NET Core 2.0 - аутентификация OpenId Connect: ошибка корреляции - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь создать аутентификацию в веб-приложении ASP.NET Core 2.0.

Моя компания использует Ping Federate, и я пытаюсь аутентифицировать своих пользователей, используя страницу входа компании, и в свою очередь проверяю возвращенный токен, используя мой ключ подписи (X509SecurityKey здесь).

Ссылка на ссылку ping login выглядит так:

https://auth.companyname.com

Я настроил файл Startup.cs, чтобы иметь возможность войти в систему и выполнить вызов этого сайта.

Я украсил свой HomeController [Authorize(Policy="Mvc")].

Я могу зайти на страницу входа, но всякий раз, когда возвращаюсь с нее, получаю ( Я попытался отключить / включить несколько проверок):

Исключение: корреляция не удалась.

Неизвестное местоположение

Исключение: при обработке удаленного входа произошла ошибка.

Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler.HandleRequestAsync ()

Сообщение об ошибке не очень полезно ... кто-нибудь сталкивался с такой проблемой раньше?

    public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
    .AddCookie()
    .AddOpenIdConnect(options =>
    {
        options.Authority = PF_LOGINPATH;
        options.ClientId = Configuration["ClientId"];
        options.ClientSecret = Configuration["ClientSecret"];
        options.Scope.Clear();

        options.ResponseType = OpenIdConnectResponseType.CodeIdTokenToken;
        options.SaveTokens = false;

        options.GetClaimsFromUserInfoEndpoint = false;//true;

        options.TokenValidationParameters = new TokenValidationParameters
        {
            RequireSignedTokens =  false,
            ValidateActor = false,
            ValidateAudience = false,
            ValidateIssuer = false,
            ValidateIssuerSigningKey = false,
            ValidateTokenReplay = false,

            // Compensate server drift
            ClockSkew = TimeSpan.FromHours(24),
            //ValidIssuer = PF_LOGINPATH;
            // Ensure key
            IssuerSigningKey = CERTIFICATE,                    

            // Ensure expiry
            RequireExpirationTime = false,//true,
            ValidateLifetime = false,//true,                    

            // Save token
            SaveSigninToken = false
        };                

    });

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Mvc", policy =>
        {
            policy.AuthenticationSchemes.Add(OpenIdConnectDefaults.AuthenticationScheme);
            policy.RequireAuthenticatedUser();
        });
    });
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();

    app.UseAuthentication();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

1 Ответ

0 голосов
/ 23 августа 2018

У меня была похожая ситуация. URL моего приложения выглядит так: "https://domain/appname" поэтому, когда кто-то набирает url "https://domain/appname/" [с завершающим слешем], он выдает ошибку корреляции. Вот как я ее разрешил (найден на каком-то другом сайте)

public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication(options =>
                {
                    //Auth schemes here
                })
                .AddOpenIdConnect(oid =>
                {
                    //Other config here
                    oid.Events = new OpenIdConnectEvents()
                    {
                        OnRemoteFailure = OnRemoteFailure

                    };
                });
        }

private Task OnRemoteFailure(RemoteFailureContext context)
        {

            if (context.Failure.Message.Contains("Correlation failed"))
            {
                context.Response.Redirect("/AppName"); // redirect without trailing slash
                context.HandleResponse();
            }

            return Task.CompletedTask;
        }
...