Dans une application ASP.NET Core MVC, nous utilisons des exigences de stratégie pour l'autorisation qui sont définies à l'aide des rôles de base de données SQL Server. Nous lançons un appel sp_helprolemember {roleName}
puis vérifier si l'utilisateur est membre de déterminer si elles passent l'exigence, par exemple gestionnaire du RequirementHandler:Conditions de mise en cache requises ASP.NET Core
// 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 est une colonne de tableau byte[]
de sp_helprolemember
Cela fonctionne, mais mon Le souci est d'interroger la base de données chaque fois que nous avons besoin de gérer une exigence, qui, basée sur un code déjà écrit peut être plusieurs fois dans une vue.
Est-il préférable de mettre ces données en cache dans la mémoire pour minimiser les requêtes de la base de données? J'ai eu l'idée d'utiliser la mise en cache en mémoire pour chaque gestionnaire d'exigences afin de garder une trace des utilisateurs précédemment autorisés et de lui donner une fenêtre glissante de quelques minutes avant de les effacer, mais je n'ai jamais travaillé avec Je me demandais s'il y avait une pratique standard pour faire quelque chose comme ça.
Est-ce que 'GetAllByRole' renvoie tous les membres dans le nom de rôle donné? – Win
Oui, il appelle simplement la procédure stockée système SQL Server sp_helprolemember avec le nom de rôle fourni. – Valuator
Pourrait-il être des milliers de lignes en fonction du nombre de membres assignés à la rolename? Souhaitez-vous connaître l'approche alternative qui pourrait nécessiter certaines modifications dans votre code existant? – Win