OWIN, как настроить / signout-oidc для удаления куки - PullRequest
1 голос
/ 06 июня 2019

Я создаю приложения, которые авторизованы сервером OIDC для персонального запуска. Сервер использует библиотеку Openiddict, а приложения используют OWIN для конфигурации. это связано с тем, что сервер OIDC работает на ядре .Net, а приложения - на платформе .Net.

При попытке выйти из этих приложений я перенаправляю на сервер OIDC / Учетную запись / Выход из системы, что, в свою очередь, позволяет получить все зарегистрированные приложения и открыть iframe с URL-адресом выхода из переднего канала (/signout-oidc).

При выходе из системы выдаст 404 not found, то есть URL "example.com/signout-oidc" не был создан.

Используемые библиотеки для приложения:

  • Microsoft.Owin.Security
  • Microsoft.Owin.Security.Cookies
  • Microsoft.Owin.Security.OpenIdConnect
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
            app.Use(async (Context, next) =>
            {
                Debug.WriteLine("1 ==>request, before cookie auth");
                await next.Invoke();
                Debug.WriteLine("6 <==response, after cookie auth");
            });

            app.UseCookieAuthentication(new CookieAuthenticationOptions());
            app.Use(async (Context, next) =>
            {
                Debug.WriteLine("2 ==>after cookie, before OIDC");
                await next.Invoke();
                Debug.WriteLine("5 <==after OIDC");
            });

            app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions()
                {
                    ClientId = "application-client-id",
                    ClientSecret = "application-client-secret",
                    Scope = "openid profile email",
                    Authority = "personal-oidc-link",
                    AuthenticationMode = AuthenticationMode.Active,
                    ResponseType = OpenIdConnectResponseType.IdToken,
                    RedirectUri = "https://example.com/signin-oidc",
                    TokenValidationParameters = new TokenValidationParameters
                    {
                        NameClaimType = ClaimTypes.NameIdentifier
                    },
                });
            app.Use(async (Context, next) =>
            {
                Debug.WriteLine("3 ==>after OIDC, before leaving the pipeline");
                await next.Invoke();
                Debug.WriteLine("4 <==after entering the pipeline, before OIDC");
            });

Конфигурация сервера:

services.AddOpenIddict()
                .AddCore(options =>
                {
                    // Configure OpenIddict to use the Entity Framework Core stores and entities.
                    options.UseEntityFrameworkCore()
                        .UseDbContext<DataContext>()
                        .ReplaceDefaultEntities<CompanyApplication, CompanyAuthorization, CompanyScope, CompanyToken, Guid>();
                })
                .AddServer(options =>
                {
                    options.UseMvc();

                    options.UseJsonWebTokens();
                    options.AddEphemeralSigningKey("RS512");
                    // options.AddDevelopmentSigningCertificate();

                    if (this.environment.IsDevelopment())
                    {
                        options.DisableHttpsRequirement();
                    }

                    // Enable the authorization, logout, token and userinfo endpoints.
                    options
                        .EnableAuthorizationEndpoint("/oidc/authorize")
                        .EnableLogoutEndpoint("/Account/Logout")
                        .EnableTokenEndpoint("/oidc/token")
                        .EnableUserinfoEndpoint("/oidc/userinfo");

                    options
                        .AllowAuthorizationCodeFlow()
                        .AllowImplicitFlow()
                        .AllowRefreshTokenFlow();

                    options.RegisterClaims(
                        CompanyClaims.FriendlyName,
                        CompanyClaims.Email,
                        CompanyClaims.EmailVerified,
                        CompanyClaims.Sub,
                        CompanyClaims.Group,
                        CompanyClaims.GivenName,
                        CompanyClaims.MiddleName,
                        CompanyClaims.FamilyName);

                    // Mark the "email", "profile" and "roles" scopes as supported scopes.
                    options.RegisterScopes(
                        OpenIddictConstants.Scopes.Email,
                        OpenIddictConstants.Scopes.Profile,
                        OpenIddictConstants.Scopes.Roles);
                });
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie(
                    CookieAuthenticationDefaults.AuthenticationScheme,
                    o =>
                    {
                        o.AccessDeniedPath = "/Home/Denied";
                        o.LoginPath = "/Account/Login";
                        o.LogoutPath = "/Account/Logout";

                        o.Cookie.SameSite = SameSiteMode.Strict;
                        o.Cookie.Name = "session";
                        o.Cookie.Expiration = TimeSpan.FromHours(24);
                        o.ExpireTimeSpan = TimeSpan.FromHours(24);
                    });
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseAuthentication();

            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseResponseCaching();

            app.UseMvcWithDefaultRoute();
        }   

Я ожидаю, что OWIN генерирует маршрут / signout-oidc, и при вызове удаляет cookie аутентификации.

Редактировать: Добавлено еще несколько файлов конфигурации.

1 Ответ

0 голосов
/ 06 июня 2019

Вам нужно использовать

PostLogoutRedirectUri = ""
...