จะออกจากระบบผู้ใช้ทั้งหมดในการตรวจสอบคุกกี้ ASP.NET Core ได้อย่างไร

ฉันใช้ ASP.NET Core MVC กับ CookieAuthentication มีวิธีที่ฉันสามารถออกจากระบบผู้ใช้ทั้งหมดพร้อมกันได้หรือไม่? ฉันลองรีเซ็ต IIS แล้ว - ใช้งานไม่ได้ ฉันพยายามลบเซสชันของผู้ใช้ทั้งหมด (ฉันใช้ฐานข้อมูลสำหรับจัดเก็บเซสชัน) - ไม่ได้ผล

มีความคิดอะไรบ้าง?


person John-Luke Laue    schedule 17.05.2017    source แหล่งที่มา
comment
หากต้องการออกจากระบบผู้ใช้ทั้งหมด คีย์การเข้ารหัสอาจเปลี่ยนแปลงหรือคุกกี้การรับรองความถูกต้องอาจถูกเปลี่ยนชื่อ   -  person Zygimantas    schedule 03.07.2018
comment
@Zygimantas ตรวจสอบคำตอบนี้ stackoverflow.com/a/36050939/5233410   -  person Nkosi    schedule 03.07.2018
comment
@Nkosi: เซิร์ฟเวอร์ข้อมูลประจำตัวถูกใช้ในลิงก์ของคุณ คำถามไม่ได้กล่าวถึง เพียงการรับรองความถูกต้องคุกกี้ธรรมดาๆ   -  person Zygimantas    schedule 03.07.2018


คำตอบ (3)


คุณสามารถใช้ CookieAuthenticationOptions.SessionStore คุณสมบัติ เพื่อจัดเก็บข้อมูลประจำตัวในฝั่งเซิร์ฟเวอร์ เพื่อให้คุณสามารถล้างข้อมูลทั้งหมดเมื่อคุณต้องการ

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

ด้วย CookieAuthentication คุกกี้เป็นเพียงสตริงที่เข้ารหัสซึ่งมีชื่อผู้ใช้ บทบาท และข้อมูลเสริม กล่าวโดยสรุป จะระบุ ผู้ใช้ ไม่ใช่ เซสชัน เซสชันการฆ่าไม่ได้ทำให้คุกกี้ใช้งานไม่ได้

ดังที่กล่าวไปแล้ว คุณสามารถใส่ตัวระบุเซสชันหรือโทเค็นอื่น ๆ ลงในข้อมูลเสริมของคุกกี้ จากนั้นตรวจสอบความถูกต้องในระหว่างกระบวนการตรวจสอบสิทธิ์ ตัวอย่างของคนที่พยายามทำเช่นนี้สามารถพบได้ ที่นี่

อีกทางเลือกหนึ่งคือแทนที่จะทำให้เซสชันใช้งานไม่ได้ คุณสามารถปิดใช้งานผู้ใช้ชั่วคราวในพื้นที่เก็บข้อมูลผู้ใช้ของคุณได้ ต่อไปนี้คือตัวอย่างการใช้ ASPNET Identity 2.0

ตัวเลือกที่สาม (นิวเคลียร์) คือการเปลี่ยน รหัสเครื่องบนเว็บเซิร์ฟเวอร์ทั้งหมด ซึ่งจะทำให้คุกกี้การตรวจสอบความถูกต้องของแบบฟอร์มเก่าไม่สามารถอ่านได้ และบังคับให้ผู้ใช้ทั้งหมดลงชื่อเข้าใช้อีกครั้ง

person John Wu    schedule 17.05.2017

มันง่ายมาก เปลี่ยนชื่อคุกกี้เข้าสู่ระบบ

ใน startup.cs ให้เปลี่ยนชื่อเริ่มต้นเป็นอะไรก็ได้

 options.Cookie.Name = "NewName";

ตัวอย่างที่สมบูรณ์:

  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