Bagaimana cara keluar semua pengguna dalam otentikasi cookie ASP.NET Core?

Saya menggunakan ASP.NET Core MVC dengan CookieAuthentication. Apakah ada cara agar saya bisa mengeluarkan semua pengguna sekaligus? Saya mencoba mengatur ulang IIS - tidak berhasil. Saya mencoba menghapus semua sesi pengguna (saya menggunakan database untuk penyimpanan sesi) - tidak berhasil.

Ada ide?


person John-Luke Laue    schedule 17.05.2017    source sumber
comment
Untuk logout semua pengguna, kunci enkripsi dapat diubah atau cookie otentikasi dapat diganti namanya.   -  person Zygimantas    schedule 03.07.2018
comment
@Zygimantas periksa jawaban ini. stackoverflow.com/a/36050939/5233410   -  person Nkosi    schedule 03.07.2018
comment
@Nkosi: Server identitas digunakan di tautan Anda. Pertanyaannya tidak menyebutkannya, hanya otentikasi cookie sederhana.   -  person Zygimantas    schedule 03.07.2018


Jawaban (3)


Anda dapat menggunakan CookieAuthenticationOptions.SessionStore Properti, untuk menyimpan informasi identitas di sisi server sehingga Anda dapat menghapus semuanya saat Anda membutuhkannya.

public void ConfigureServices(IServiceCollection services)
{
    MemoryCacheTicketStore memoryCacheTicketStore = new MemoryCacheTicketStore();
    services.AddSingleton<MemoryCacheTicketStore>(memoryCacheTicketStore);

    services.AddAuthentication().AddCookie(cfg =>
    {
        cfg.SessionStore = memoryCacheTicketStore;
    });
}

public class SessionController : Controller
{
    private readonly MemoryCacheTicketStore memoryCacheTicketStore;

    public SessionController(MemoryCacheTicketStore memoryCacheTicketStore)
    {
        this.memoryCacheTicketStore = memoryCacheTicketStore;
    }

    public Task ClearAllSession()
    {
        return memoryCacheTicketStore.ClearAll();
    }
}

public class MemoryCacheTicketStore : ITicketStore
{
    private const string KeyPrefix = "AuthSessionStore-";
    private IMemoryCache _cache;

    public MemoryCacheTicketStore()
    {
        _cache = new MemoryCache(new MemoryCacheOptions());
    }

    public async Task ClearAll()
    {
        _cache.Dispose();
        _cache = new MemoryCache(new MemoryCacheOptions());
    }

    public async Task<string> StoreAsync(AuthenticationTicket ticket)
    {
        var guid = Guid.NewGuid();
        var key = KeyPrefix + guid.ToString();
        await RenewAsync(key, ticket);
        return key;
    }

    public Task RenewAsync(string key, AuthenticationTicket ticket)
    {
        var options = new MemoryCacheEntryOptions();
        var expiresUtc = ticket.Properties.ExpiresUtc;
        if (expiresUtc.HasValue)
        {
            options.SetAbsoluteExpiration(expiresUtc.Value);
        }
        options.SetSlidingExpiration(TimeSpan.FromHours(1)); // TODO: configurable.

        _cache.Set(key, ticket, options);

        return Task.FromResult(0);
    }

    public Task<AuthenticationTicket> RetrieveAsync(string key)
    {
        AuthenticationTicket ticket;
        _cache.TryGetValue(key, out ticket);
        return Task.FromResult(ticket);
    }

    public Task RemoveAsync(string key)
    {
        _cache.Remove(key);
        return Task.FromResult(0);
    }
}
person Kahbazi    schedule 06.07.2018

Dengan CookieAuthentication, cookie hanyalah sebuah string terenkripsi yang berisi nama pengguna, peran, dan data tambahan. Singkatnya, ini mengidentifikasi pengguna, bukan sesi. Membunuh sesi tidak membuat cookie menjadi tidak valid.

Meskipun demikian, Anda dapat memasukkan pengidentifikasi sesi atau token lain ke dalam data tambahan cookie, dan kemudian memvalidasinya selama proses autentikasi. Contoh seseorang yang mencoba melakukan ini dapat ditemukan di sini.

Opsi lainnya adalah alih-alih membatalkan sesi, Anda dapat menonaktifkan sementara pengguna di repositori pengguna Anda. Berikut adalah contoh penggunaan ASPNET Identity 2.0.

Opsi ketiga (nuklir) adalah mengubah kunci mesin di semua server web , yang akan membuat cookie autentikasi formulir lama tidak dapat dibaca, sehingga memaksa semua pengguna untuk masuk lagi.

person John Wu    schedule 17.05.2017

itu sangat sederhana. ubah nama cookie login

di startup.cs, ubah nama default menjadi apa saja.

 options.Cookie.Name = "NewName";

Contoh Lengkap:

  services.ConfigureApplicationCookie(options =>
            {
                options.Cookie.Name = "NewName"; //<-- Here
                options.Cookie.HttpOnly = true;
              ...
                options.Events = options.Events ?? new CookieAuthenticationEvents();
                var onForbidden = options.Events.OnRedirectToAccessDenied;
                var onUnauthorized = options.Events.OnRedirectToLogin;
                options.Events.OnRedirectToAccessDenied = (context) => OnRedirect(context, onForbidden, HttpStatusCode.Forbidden);
                options.Events.OnRedirectToLogin = (context) => OnRedirect(context, onUnauthorized, HttpStatusCode.Unauthorized);
            });
person Dorathoto    schedule 10.08.2020