Bearer Token - wylogowanie

0

Cześć, jakoś tak nie za bardzo czuję, jak poprawnie wylogować użytkownika. Cała sesja przebiega za pomocą JWT i to jest robione tak:

  • użytkownik podaje login i hasło - to leci do serwera POSTem
  • serwer sprawdza, czy hasło jest poprawne: signInManager.PasswordSignInAsync
  • następnie wydawany jest token:
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["JwtKey"]));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var token = new JwtSecurityToken(
                issuer: config["JwtIssuer"],
                audience: config["JwtIssuer"],
                claims: claims,
                expires: DateTime.Now.AddMinutes(15),
                signingCredentials: creds);


            return Ok(new
            {
                token = new JwtSecurityTokenHandler().WriteToken(token),
                expiration = token.ValidTo
            }
                );

I teraz szukając informacji w necie o wylogowaniu nie znajduję niczego konkretnego. Wg tego, co sobie wymyśliłem, to wystarczy, że wylogowanie robię jedynie po stronie użytkownika - usuwając token z headera. Czy to faktycznie wystarczy, czy powinienem zrobić coś jeszcze po stronie serwera?

Drugie moje pytanie odnosi się typowo do logowania. Jak napisałem, login i hasło użytkownika idą POSTem do serwera. To jest czysty tekst. Czy jeśli będę miał SSL, to on mi załatwi całą sprawę bezpieczeństwa, że nikt nie będzie mógł podejrzeć sobie tego hasła? Czy może powinienem sam w jakiś sposób zakodować te dane przed wysłaniem i rozkodować je po stronie serwera?

0
  1. Token powinien mieć krótki czas ważności, wtedy to, że kasujesz go tylko po stronie klienta nie jest wielkim problemem. Ewentualnie możesz dorobić sobie jakąś blacklistę, na którą wpisujesz tokeny wylogowanych userów do czasu przeterminowania się.
  2. Od tego właśnie jest SSL, żeby nikt nie mógł sobie podejrzeć komunikacji :)
0

Moje tokeny mają ważność 15 minut. To chyba dość optymalne rozwiązanie. Ale teraz widzę, że coś jest nie tak z tym wylogowaniem. Po stronie klienta klepię tak:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "");

(client to HttpClient)

ale po tym, gdy wysyłam żądanie do serwera, to serwer uznaje, że klient jest wciąż zalogowany.

0

sprawdź czy po za JWT nie masz też cookie.

0

Mam, konfiguracja (cookie i bearer) wygląda tak:

services.ConfigureApplicationCookie(options =>
            {
                options.Cookie.Name = "MojeCookie";
                options.ExpireTimeSpan = TimeSpan.FromMinutes(3600); //todo: change to 10
                options.Events = new CookieAuthenticationEvents()
                {
                    OnRedirectToAccessDenied = (ctx) =>
                    {
                        ctx.Response.StatusCode = 401;
                        return Task.CompletedTask;
                    }
                };
            });


            // ===== Add Jwt Authentication ========
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); // => remove default claims
            services
                .AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

                })
                .AddJwtBearer(cfg =>
                {
                    cfg.RequireHttpsMetadata = false;
                    cfg.SaveToken = true;
                    cfg.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidIssuer = Configuration["JwtIssuer"],
                        ValidAudience = Configuration["JwtIssuer"],
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtKey"])),
                        ClockSkew = TimeSpan.Zero // remove delay of token when expire
                    };
                });

1 użytkowników online, w tym zalogowanych: 0, gości: 1