我正在使用带有CookieAuthentication的ASP.NET Core MVC。有没有办法可以立刻签署所有用户?我尝试重置IIS - 没有工作。我尝试删除所有用户'会话(我使用数据库进行会话存储) - 没有工作。
有什么想法吗?
答案 0 :(得分:3)
使用CookieAuthentication,cookie只是一个加密字符串,其中包含用户的名称,角色和辅助数据。简而言之,它标识用户,而不是会话。杀戮会话不会使cookie无效。
话虽如此,您可以在cookie的辅助数据中填充会话标识符或其他标记,然后在身份验证过程中对其进行验证。可以找到某人尝试此操作的示例here。
另一个选项是,您可以暂时禁用用户存储库中的用户,而不是使会话无效。 Here是使用ASPNET Identity 2.0的示例。
第三个(核)选项是更改所有Web服务器上的machine key,这将使任何旧表单身份验证cookie无法读取,从而迫使所有用户再次登录。
答案 1 :(得分:1)
您可以使用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);
}
}
答案 2 :(得分:-1)
这很简单。 更改登录cookie名称
在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);
});