using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using System.Security.Claims;
public class AuthenticationController : Controller
{
private readonly IUsersService _usersService;
private readonly IMemoryCache _cache;
public AuthenticationController(IUsersService usersService, IMemoryCache cache)
{
_usersService = usersService;
_cache = cache;
}
[HttpGet]
public IActionResult Logout()
{
// Logout currently logged in user
var principal = HttpContext.User as ClaimsPrincipal;
var userId = principal?.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value;
_cache.Set("revoke-" + userId, true);
return View();
}
[HttpGet]
public async Task LogoutAll()
{
// Fetch users from database
var users = await _usersService.GetAllUsersAsync();
// Logout all users
foreach (var user in users)
{
var userId = user.Id;
_cache.Set("revoke-" + userId, true);
}
}
}
var claims = new List<Claim>
{
// Set the user id
new Claim(ClaimTypes.NameIdentifier, userId)
};
var claimsIdentity = new ClaimsIdentity(claims,
CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties();
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
authProperties);
4条答案
按热度按时间xeufq47z1#
您可以使用
CookieAuthenticationOptions.SessionStore
属性,将身份信息存储在服务器端,以便您可以在需要时将其全部清除。字符串
63lcw9qa2#
使用CookieAuthentication,cookie只是一个加密的字符串,包含用户的名称,角色和辅助数据。简而言之,它识别 * 用户 ,而不是 * 会话。 终止会话不会使cookie无效。
也就是说,你可以在cookie的辅助数据中填充一个会话标识符或其他令牌,然后在认证过程中进行验证。
另一种选择是暂时禁用用户存储库中的用户,而不是使会话无效。Here是使用ASPNET Identity 2.0的一个示例。
第三个(核心)选项是更改所有Web服务器上的machine key,这将使任何旧的表单身份验证cookie不可读,迫使所有用户重新登录。
e7arh2l63#
在这种情况下,应用程序需要对后端用户访问更改做出React。身份验证Cookie将保护应用程序,但在Cookie的生命周期内保持有效。使用有效Cookie,最终用户在注销或Cookie过期之前不会看到任何更改。
在ASP.NET Core中,验证身份验证cookie更改的最合适的解决方案是通过Cookie身份验证事件。验证事件将从cookie中的标识声明执行后端查找。此事件扩展
CookieAuthenticationEvents
。这里我们重写ValidatePrincipal
方法。字符串
要通过DI设置
IMemoryCache
,请将AddMemoryCache
放在Startup
类的ConfigureSerices
方法中。调用context.RejectPrincipal()
会立即生效,并将用户踢回Login以获取新的身份验证cookie。在
Startup
类的ConfigureServices
方法中注册事件。型
现在,您可以通过在控制器的相应方法中设置该高速缓存来注销用户:
型
请注意,这依赖于在控制器操作方法中设置的内存持久性。请记住,这种类型的事件在每个请求中都运行一次,因此您需要使用高效的缓存策略。
登录
确保在Controller中负责登录的action方法中添加声明。
型
有关更多信息,请参见在没有ASP.NET核心标识的情况下使用cookie身份验证。
iyfamqjs4#
这很简单.更改登录cookie名称
在startup.cs中,将默认名称更改为任意名称。
字符串
完整示例:
型