WsFederation с. net ядром без сохранения претензий - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь использовать ws-federation с. net core для обработки единого входа. Мне удалось получить токен безопасности от моей федеративной службы, но утверждения, полученные из токена безопасности, не добавляются пользователю, который проходит проверку подлинности, и даже несмотря на то, что после получения токена в него записывается повар ie после проверки пользователь не получает обновленный набор, если идентифицирует или утверждает, оставляя пользователя в состоянии, когда HttpContext.User.Identity.IsAuthenticated всегда имеет значение false.

My ConfigureServies:

public void ConfigureServices(IServiceCollection services)
        {
            IdentityModelEventSource.ShowPII = true;
            services.AddControllersWithViews();


            services.AddAuthentication(sharedOptions =>
            {
                sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
                sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            }
            ).AddWsFederation(options =>
            {
                WsFederationConfiguration configuration = new WsFederationConfiguration();
                configuration.Issuer = "http://localhost/STSSpike2/V1";
                configuration.TokenEndpoint = "http://localhost/STSSpike/V1";
                options.Configuration = configuration;
                options.Wtrealm = "http://localhost/STSAwareApp/Test";
                options.Wreply = "http://localhost/STSAwareApp/signin-wsfed";
                options.SecurityTokenHandlers.Add(new FakeTokenValidator());

                options.Events.OnAuthenticationFailed = context =>
                {
                    Console.WriteLine(context.Exception.ToString());
                    return Task.CompletedTask;
                };

                options.Events.OnAccessDenied = context =>
                {
                    Console.WriteLine(context);
                    return Task.CompletedTask;
                };

                options.Events.OnRemoteFailure = context =>
                {
                    Console.WriteLine(context.Failure);
                    return Task.CompletedTask;
                };

                options.Events.OnSecurityTokenReceived = context =>
                {
                    Console.WriteLine(context.ProtocolMessage);
                    return Task.CompletedTask;
                };

                options.Events.OnSecurityTokenValidated = context =>
                {
                    Console.WriteLine(context);
                    return Task.CompletedTask;
                };

            }).AddCookie(options =>
            {
                options.Cookie.Name = "TestStsAuth1";
                options.ExpireTimeSpan = new TimeSpan(0, 30, 0);
                options.Cookie.IsEssential = true;
                //options.Cookie.HttpOnly = true;
                options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
                options.Events = new CookieAuthenticationEvents
                {
                    OnValidatePrincipal = val =>
                    {
                        Console.WriteLine("validated");
                        return Task.CompletedTask;
                    },
                    OnRedirectToAccessDenied = denied =>
                    {
                        Console.WriteLine("validated");
                        return Task.CompletedTask;
                    },
                    OnRedirectToReturnUrl = redirect =>
                    {
                        Console.WriteLine("validated");
                        return Task.CompletedTask;
                    },
                    OnSignedIn = signedIn =>
                    {
                        Console.WriteLine("Signedin");
                        return Task.CompletedTask;
                    },
                    OnSigningIn = signingIn =>
                    {
                        Console.WriteLine("signing in");
                        return Task.CompletedTask;
                    }
                };
            });

            services.AddLogging(
                builder =>
                {
                builder.AddFilter("Microsoft", LogLevel.Trace)
                       .AddFilter("System", LogLevel.Trace)
                       .AddConsole();
                });
        }

В приведенном выше коде Events.OnSecurityTokenValidated и CookieOptions.Events.OnSignedIn указывают на принципала, которые получены из токена безопасности, возвращенного из ws-federation. Однако HttpContext.User никогда не обновляется с новым удостоверением. Поэтому после проверки токена безопасности клиент неоднократно перезванивает на сервер объединения для запроса токена, и сообщения журнала регистрируются только следующим образом: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Информация: авторизация не удалась.

1 Ответ

0 голосов
/ 23 апреля 2020

Проблема возникла из-за моего вызова Configure в том, что я вызвал UseAuthorization, прежде чем я вызвал UseAuthentication. Этот ответ был ключом к выяснению, в чем заключается проблема.

...