繁体   English   中英

如何更新 Asp.net 核心中的用户声明

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM