Używam IdentServer4 i klienta MVC. Gdy sesja klientów wygasa, chcę, aby mój użytkownicy mogli zostać zmuszeni do znowu logowania. Jednak bez względu na to, co robię Identserver wydaje się automatycznie zalogować użytkownika z powrotem, gdy sesja się kończy.

Moje startup w kliencie jest (sesja ma 30 sekund)

services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";                                                
        })
            .AddCookie("Cookies", options => { options.ExpireTimeSpan = new TimeSpan(0, 0, 30); })
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = identityUrl;
                options.RequireHttpsMetadata = false;

                options.SaveTokens = true;                  
                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("Billing");
                options.Scope.Add("offline_access");

                options.UseTokenLifetime = false;                   
            });

Następnie moja konfiguracja w IdentityServer jest następująca:

new Client
            {
                ClientId = "Test",
                ClientName = "Test",
                AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,

                AlwaysIncludeUserClaimsInIdToken = true,

                RequireConsent = false,

                IdentityTokenLifetime = 30,
                AccessTokenLifetime = 30,

                ClientSecrets =
                {
                    new Secret("secret".Sha256())
                },              

                RedirectUris = { billingUrl + "/signin-oidc" },
                PostLogoutRedirectUris = { billingUrl + "/signout-callback-oidc" },

                AllowedScopes =
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "Billing",
                    "role",
                    "VisionBlue.Cloud.BillingAPI"
                },

                AllowOfflineAccess = true
            },

Korzystanie z Fiddlera Widzę po 30 sekundach żądanie zostanie wysłany do / Connect / Authorize na IdentityServer, który automatycznie rejestruje użytkownika ponownie.

Jakieś pomysły? Ustawiłem wszystkie limitowanie do 30 sekund jako test.

4
keitn 8 luty 2018, 12:01

4 odpowiedzi

Najlepsza odpowiedź

Użyj parametru OpenID Connect prompt=login na żądanie autoryzacji (https://openid.net/specs/openid-Connect-core -1_0.html # authrequest). Powiedzie to IdentityServer, który chcesz ponownie uwierzytelnić zamiast używać długości sesji SSO lub Identserver.

Powinieneś być w stanie to zrobić w Rdzeniu ASP.NET za pomocą openidConnections:

options.Events.OnRedirectToIdentityProvider = context =>
{
    context.ProtocolMessage.Prompt = "login";
    return Task.CompletedTask;
};

Może to być łatwiejszy sposób.

12
André Snede Kock 20 marzec 2020, 07:51

Akceptowana odpowiedź jest poprawna, ale jest inna opcja i to jest max_age param. Dzięki temu możesz określić maksymalny dozwolony czas, ponieważ autht_time i automatycznie poprosi użytkownika o uwierzytelnianie ponownie, jeśli ten czas zostanie przekroczony. Możesz także sprawdzić authtime roszczenia w id_token przy podpisaniu go, aby upewnić się, że jest w żądanym oknie. Polecam to, ponieważ jest łatwy dla użytkowników końcowych do usunięcia monitu = logowanie lub max_age = xxx z żądania autoryzacji powinni pragnąć.

1
mackie 8 luty 2018, 15:13

Wygasa tylko plików cookie w aplikacji klienta. Pliki cookie IDS należy również wygaśnąć. Spójrz na metody POST dla lokalnych i zewnętrznych loginów.

Będziesz chciał znaleźć sekcję, w której zostanie utworzone AuthenticationProperties (w Quickstart, jest to miejsce, w którym ustawia się AuthenticationToken), a także ustawić IsPersistent i ExpiresUtc przed właściwościami przekazane HttpContext.SignInAsync.

(Nawiasem mówiąc, może być również wykorzystany do obsługi trwałego logowania między sesjami - ustawić długi czas trwania w IDS4, a następnie dodać domyślny profil OIDC dla klienta i wyzwalać jednorazową próbę logowania bez monitów, gdy rozpocznie się nowa sesja anonimowa .)

0
McGuireV10 8 luty 2018, 12:41

Jeśli czytam tutaj: http://docs.IidentityServer.io/en/release/topics/refresh_tokens. HTML.

Ta linia włącza się na automatyczne ponowne logowanie: ALLOFFLINEACCESS = true

Ustaw go z powrotem na false, to powinno rozwiązać problem.

-1
Tom Söhne 8 luty 2018, 09:09