ฉันใช้ ASP.NET Core MVC กับ CookieAuthentication มีวิธีที่ฉันสามารถออกจากระบบผู้ใช้ทั้งหมดพร้อมกันได้หรือไม่? ฉันลองรีเซ็ต IIS แล้ว - ใช้งานไม่ได้ ฉันพยายามลบเซสชันของผู้ใช้ทั้งหมด (ฉันใช้ฐานข้อมูลสำหรับจัดเก็บเซสชัน) - ไม่ได้ผล
มีความคิดอะไรบ้าง?
ฉันใช้ ASP.NET Core MVC กับ CookieAuthentication มีวิธีที่ฉันสามารถออกจากระบบผู้ใช้ทั้งหมดพร้อมกันได้หรือไม่? ฉันลองรีเซ็ต IIS แล้ว - ใช้งานไม่ได้ ฉันพยายามลบเซสชันของผู้ใช้ทั้งหมด (ฉันใช้ฐานข้อมูลสำหรับจัดเก็บเซสชัน) - ไม่ได้ผล
มีความคิดอะไรบ้าง?
คุณสามารถใช้ 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);
}
}
ด้วย CookieAuthentication คุกกี้เป็นเพียงสตริงที่เข้ารหัสซึ่งมีชื่อผู้ใช้ บทบาท และข้อมูลเสริม กล่าวโดยสรุป จะระบุ ผู้ใช้ ไม่ใช่ เซสชัน เซสชันการฆ่าไม่ได้ทำให้คุกกี้ใช้งานไม่ได้
ดังที่กล่าวไปแล้ว คุณสามารถใส่ตัวระบุเซสชันหรือโทเค็นอื่น ๆ ลงในข้อมูลเสริมของคุกกี้ จากนั้นตรวจสอบความถูกต้องในระหว่างกระบวนการตรวจสอบสิทธิ์ ตัวอย่างของคนที่พยายามทำเช่นนี้สามารถพบได้ ที่นี่
อีกทางเลือกหนึ่งคือแทนที่จะทำให้เซสชันใช้งานไม่ได้ คุณสามารถปิดใช้งานผู้ใช้ชั่วคราวในพื้นที่เก็บข้อมูลผู้ใช้ของคุณได้ ต่อไปนี้คือตัวอย่างการใช้ ASPNET Identity 2.0
ตัวเลือกที่สาม (นิวเคลียร์) คือการเปลี่ยน รหัสเครื่องบนเว็บเซิร์ฟเวอร์ทั้งหมด ซึ่งจะทำให้คุกกี้การตรวจสอบความถูกต้องของแบบฟอร์มเก่าไม่สามารถอ่านได้ และบังคับให้ผู้ใช้ทั้งหมดลงชื่อเข้าใช้อีกครั้ง
มันง่ายมาก เปลี่ยนชื่อคุกกี้เข้าสู่ระบบ
ใน 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);
});