I want to create policy based authorisation for aspnet.core
I have lots of policies that I want to implement and I don't want to bloat the startup.cs file with policies.
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(options =>
{
options
.AddPolicy("Policy1", policyBuilder =>
{
policyBuilder
.RequireClaim("scope", "1")
.Build();
}).AddPolicy("Policy2", policyBuilder =>
{
policyBuilder
.RequireClaim("scope", "2")
.Build();
}).AddPolicy("Policy3", policyBuilder =>
{
policyBuilder
.RequireClaim("scope", "3")
.Build();
}).AddPolicy("Policy4", policyBuilder =>
{
policyBuilder
.RequireClaim("scope", "4")
.Build();
;
});
});
}
I want to inject all the policies at startup.
Does anyone have any idea how to do this?
I thought about creating a factory that gets all the policies by reflection, but I really want to be able to inject classes into the policies.
e.g.
public interface IPolicy
{
string Name { get; }
AuthorizationPolicy AuthorizationPolicy { get; }
}
public class UserCreatePolicy : IPolicy
{
public const string Name = "UserCreatePolicy";
public UserCreatePolicy(IUserRoleService userRoleService)
{
_userRoleService = userRoleService;
}
public AuthorizationPolicy AuthorizationPolicy =>
new AuthorizationPolicyBuilder()
.RequireClaim("scope", _userRoleService.GetRole(1))
.Build();
}
public class AuthorizationPolicyFactory
{
public static void Create(AuthorizationOptions authorizationOptions)
{
typeof(IPolicy).Assembly
.GetTypes()
.Where(x => typeof(IPolicy).IsAssignableFrom(x) && !x.IsAbstract && !x.IsInterface)
.ToList()
.ForEach(type =>
{
if (Activator.CreateInstance(type) is IPolicy policy)
{
authorizationOptions.AddPolicy(policy.Name, policy.AuthorizationPolicy);
}
});
}
}
Ideally I don't want to have to use reflection and instead use Dependency injection.