Question

Comment pourrais-je utiliser la mise en cache peut-être pour aider cet attribut le long? Surtout ne pas avoir à faire beaucoup d'appels à container.GetService et obtenir l'utilisateur. pourrais-je mettre un peu de mise en cache en place qui cache l'identité comme la clé et le planificateur de la valeur et il suffit de regarder vers le haut?

    public class AdminsAndProgramManagersOnlyAttribute : FilterAttribute, IAuthorizationFilter
{
    public AdminsAndProgramManagersOnlyAttribute()
    {
        Order = 1; //Must come AFTER AuthenticateAttribute
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        var userRepository = GlobalApplication.container.GetService<IRepository<ProjectPlannerInfo>>();
        var identity = filterContext.HttpContext.User.Identity;
        var planner = userRepository.GetAll().WhereEmailIs(identity.Name);

        if (!planner.IsInRole("Db Admin") || planner.ProgramManager == 1)
        {
            filterContext.Result = new RedirectToRouteResult("error", new RouteValueDictionary(new { controller = "Error", action = "InsufficientPrivileges", reason = "Contract" }));
        }
    }
}

soo ...

quelque chose comme ça?

 public void OnAuthorization(AuthorizationContext filterContext)
    {
        var identity = filterContext.HttpContext.User.Identity;

        if (filterContext.HttpContext.Cache[identity.Name] == null)
        {
            if (filterContext.HttpContext.Cache["repo"] == null)
            {
                filterContext.HttpContext.Cache.Add("repo", GlobalApplication.container.GetService<IRepository<ProjectPlannerInfo>>(), null, DateTime.Now.AddSeconds(30), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
            }

            var userRepository = filterContext.HttpContext.Cache["repo"] as IRepository<ProjectPlannerInfo>;

            filterContext.HttpContext.Cache.Add(identity.Name, userRepository.GetAll().WhereEmailIs(identity.Name), null, DateTime.Now.AddSeconds(30), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
        }

        var planner = filterContext.HttpContext.Cache[identity.Name] as ProjectPlannerInfo;

        if (!planner.IsInRole("Db Admin") || planner.ProgramManager == 1)
        {
            filterContext.Result = new RedirectToRouteResult("error", new RouteValueDictionary(new { controller = "Error", action = "InsufficientPrivileges", reason = "Contract" }));
        }
    }
Était-ce utile?

La solution

Vous pouvez utiliser le cache intégré:

filterContext.HttpContext.Cache
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top