在ASP.NET Core MVC应用程序中,我们使用使用SQL Server数据库角色定义的授权策略要求。我们调用() => {...}
然后检查用户是否是成员以确定他们是否通过了RequirementHandler中的示例处理程序:
sp_helprolemember {roleName}
MemberSID是来自// Get Role Members
IEnumerable<RoleMember> roleMembers = _roleMemberRepository.GetAllByRole(_roleName);
SecurityIdentifier userSid = new SecurityIdentifier(context.User.Claims.Where(c => c.Type == ClaimTypes.PrimarySid).SingleOrDefault().Value);
if (roleMembers.Any(rm => new SecurityIdentifier(rm.MemberSID, 0) == userSid))
{
context.Succeed(requirement);
}
byte[]
数组列
这很有效,但我的担心是每次我们需要处理一个需求时查询数据库,基于已经编写的一些代码可以在一个View中多次。
以某种方式在内存中缓存此数据以最大限度地减少数据库查询是一种更好的做法吗?我有想法为每个需求处理程序使用内存缓存,以跟踪先前已被授权的用户,并在清除之前给它一个几分钟的滑动窗口,但我之前没有使用过类似的东西。想知道是否有做这样的事情的标准做法。
答案 0 :(得分:1)
为了避免对每个请求进行数据库访问,我们通常会将用户的授权角色名称保存为Principal中的角色声明。它基本上加密了这些声明,并将其保存在cookie中。
// Login
var claims = new List<Claim>
{
new Claim(ClaimTypes.Sid, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.GivenName, user.FirstName),
new Claim(ClaimTypes.Surname, user.LastName)
};
foreach (string roleName in authorizedRoleName)
{
claims.Add(new Claim(ClaimTypes.Role, roleName));
}
var identity = new ClaimsIdentity(claims, "local", "name", "role");
var principal = new ClaimsPrincipal(identity);
// Usage
if(context.User.HasClaim(ClaimTypes.Role, _roleName))
context.Succeed(requirement);