Search code examples
c#asp.net-mvcninjectglimpseninject.web.mvc

Injection of GlimpseSecurityPolicy


I would like to implement my own IRuntimePolicy. I am following the given example, but I need to access our database or the best would be to have our UserSession object injected.

When is the security object created on runtime? Is this possible? I have not found any examples.

We use Ninject 3.2.3 I believe (or the latest available for MVC 5).

I imagine something like

public class GlimpseSecurityPolicy : IRuntimePolicy
    {
        private readonly IAclManager aclManager;
        private readonly IUserSession userSession;

        public GlimpseSecurityPolicy(IUserSession userSession, IAclManager aclManager)
        {
            this.userSession = userSession;
            this.aclManager = aclManager;
        }

        public RuntimeEvent ExecuteOn
        {
            // check policy when request ends and when executing a resource (like glimpse.axd)
            get { return RuntimeEvent.EndRequest | RuntimeEvent.ExecuteResource; }
        }

        public RuntimePolicy Execute(IRuntimePolicyContext policyContext)
        {
            if (!this.aclManager.IsUserAllowed(UserAction.AccessGlimpse, this.userSession.GetUser()))
            {
                return RuntimePolicy.Off;
            }

            return RuntimePolicy.On;
        }
    }

Solution

  • Ultimately, we came up with only one option: to use DependencyResolver.Current.GetService<IThing>().

    The code result is then straightforward and ugly:

    public class GlimpseSecurityPolicy : IRuntimePolicy
        {
            public RuntimeEvent ExecuteOn => RuntimeEvent.EndRequest | RuntimeEvent.ExecuteResource;
    
            public RuntimePolicy Execute(IRuntimePolicyContext policyContext)
            {
                var aclManager = DependencyResolver.Current.GetService<IAclManager>();
                var userSession = DependencyResolver.Current.GetService<IUserSession>();
    
                if (!aclManager.IsUserAllowed(UserAction.AccessGlimpse, userSession.GetUser()))
                {
                    return RuntimePolicy.Off;
                }
    
                return RuntimePolicy.On;
            }
        }