[英]Caching Policy requirements ASP.NET Core
在ASP.NET Core MVC应用程序中,我们使用使用SQL Server数据库角色定义的授权策略要求。 我们调用sp_helprolemember {roleName}
,然后检查User是否是成员,以确定他们是否通过了RequirementHandler的要求,例如处理程序:
// 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);
}
MemberSID是sp_helprolemember
的byte[]
数组列
这行得通,但是我关心的是每次我们需要处理一个需求时都要查询数据库,基于已经编写的一些代码,在一个View中它可能会多次查询。
将数据以某种方式缓存在内存中以最小化数据库查询是否是更好的做法? 我的想法是为每个需求处理程序使用内存缓存来跟踪先前已被授权的用户,并在清除之前给它一个滑动窗口几分钟的时间,但是我之前从未使用过类似的东西,想知道是否有做这种事情的标准做法。
为了避免对每个请求的数据库访问,我们通常将用户的授权角色名保存为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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.