【发布时间】:2015-01-19 05:36:45
【问题描述】:
我在对用户进行身份验证时使用 .net 声明主体。在我们的系统中,一个用户拥有多个权限(最多 70 个)。
现在,与其在用户提出的每个请求上查询数据库,我认为最好将权限存储为声明。我尝试将每个权限存储为单独的声明,但即使达到 10 个权限也会极大地增加令牌的大小。
因此,我没有为 1 个权限添加 1 个声明,而是想知道如果我将所有权限添加到 1 个声明,它是否会有所不同,并且确实如此。它使令牌的大小保持较小,但我拥有所需的权限。
现在要做到这一点,我必须将我的所有权限从一个数组转换为 JSON 字符串,然后将它们保存为我的声明。为了获得索赔,我可以将字符串反序列化回一个数组,我根本不需要查询数据库。
这样做可以吗,或者这是非常糟糕的做法?我是不是在做一个定时炸弹,这样做很快就会爆炸?
示例代码在这里
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
// get user permissions
var permissions = await _permissionService.GetAllAsync(user);
// create list of all permissions
List<object> claimPermissions = new List<object>();
foreach (var item in permissions)
{
claimPermissions.Add(new
{
Action = item.Action,
Type = item.Type
});
}
// convert list to json
var json = Newtonsoft.Json.JsonConvert.SerializeObject(claimPermissions);
// add claim
identity.AddClaim(new Claim("Permissions", json));
【问题讨论】:
-
有人对此有意见吗?
-
我希望有人回答这个问题。忘记权限部分,只需将其视为 70 多个项目。这是不好的做法吗?
标签: c# asp.net .net permissions claims-based-identity