[英]How do I update user claims in Asp.net Core
嗨,我在我的 asp.net 核心 mvc 项目中有一个自定义身份验证,现在我遇到了问题。 首先我解释一下我的身份验证:这是启动配置:
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(options =>
{
options.LoginPath = "/Login";
options.LogoutPath = "/Logout";
options.AccessDeniedPath = "/AccessDenied";
options.ExpireTimeSpan = TimeSpan.FromDays(60);
});
这是我的权限检查器 class:
public class PermissionCheckerAttribute : AuthorizeAttribute, IAuthorizationFilter
{
private readonly string _permissionName;
public PermissionCheckerAttribute(string permissionName)
{
_permissionName = permissionName;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
var permissionList = context.HttpContext.User.Claims
.Where(claim => claim.Type == "permission").ToList();
var hasPermission = permissionList.Any(claim => claim.Value == _permissionName);
if (!hasPermission)
{
context.Result = new RedirectResult("/AccessDenied");
}
}
}
这是我的权限示例:
[PermissionChecker(TestControllerPermissions.Create)]
public async Task<IActionResult> Privacy()
{
return View();
}
当用户登录时,我从数据库中获取用户权限并将其存储在声明中。 一切正常,但问题是我该如何更新? 我的意思是,例如我是管理员,我将更改一些用户权限以影响该用户必须注销并再次登录,但这不是我想要的。 我如何每次都根据我的数据库更新我的用户声明? 我应该在我的权限检查器类中检查吗? 这意味着我应该为每个许可请求连接到数据库? 请给我一些白话。
这就是它的工作原理。 要么使用用户声明中的缓存信息,这可能导致使用过时的信息,要么在每次用户进入时进行查找。你目前正在做的第一个。 后者在OnAuthorization()
中向您的数据库发出请求。
另一种可能性取决于更改权限是否只能通过您的项目完成。 如果这是真的,那么您所有更改权限的方法都会将一些时间戳写入一些缓存(例如 memory 或分布式)。 当用户进来时,您将声明的生命周期(在 Bearer 令牌的情况下,有一个 nbf 字段表示(主要),当令牌创建时)与数据库的最后更新。 如果数据库更新较旧,则从声明中获取值,如果数据库更新较新,则对数据库发出请求。 旧令牌过期一段时间后,用户会获得新令牌,您可以再次使用令牌中的信息。
因此,如果这种方法有效,很大程度上取决于您是否知道(没有显式查询)上次更新数据库的时间。 另请注意,这可能会导致您的数据库使用量激增,因为在权限更改后,每个请求都会导致数据库查询,直到所有令牌都已过时,但如果确实需要这些结果也可以以类似的方式缓存,但是可能会导致高 memory 负载,具体取决于您的用户数量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.