如何在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);
});

这是我的权限检查器类:

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()中针对您的DB提出请求。

另一种可能性取决于是否只能通过您的项目来更改权限。如果这是真的,那么所有更改权限的方法都会将一些时间戳写入一些缓存(例如内存或分布式(。当用户进入时,您将索赔的生存期(在Bearer令牌的情况下,有一个nbf字段表示(主要是(创建令牌的时间(与数据库的上次更新进行比较。如果数据库更新较早,则从声明中获取值;如果数据库更新较年轻,则向数据库发出请求。一段时间后,旧的令牌过期,用户会获得新的令牌,您可以再次使用令牌中的信息。

因此,如果这种方法有效,很大程度上取决于您是否知道(在没有明确查询的情况下(上次更新数据库的时间。还要注意,这可能会导致数据库使用率飙升,因为在权限更改后,每个请求都会导致数据库查询,直到所有令牌都过期,但如果真的需要,这些结果也可以以类似的方式缓存,但可能会导致高内存负载,具体取决于用户数量。

最新更新