If you need to inject different values at runtime, then you probably should look at using IOC to do so. You can replace the default FilterProvider with an implementation of your own, that uses an IOC Container.
Here is an implementation of the filterprovider for unity:
public class InjectibleFilterProvider : FilterAttributeFilterProvider
{
private IUnityContainer cont;
public InjectibleFilterProvider(IUnityContainer container)
{
this.cont = container;
}
public override IEnumerable<Filter> GetFilters(ControllerContext controllerContext,
ActionDescriptor actionDescriptor)
{
var filters = base.GetFilters(controllerContext, actionDescriptor);
if (filters != null)
{
foreach (var filter in filters)
{
cont.BuildUp(filter.Instance.GetType(), filter.Instance);
}
return filters;
}
return default(IEnumerable<Filter>);
}
}
Then you just need to wrap the AuthorizeAttribute a little bit:
public class ModifiedAuthFilter : AuthorizeAttribute
{
[Dependency]
public IRoleManager Manager { get; set; }
public string DesiredRoles { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
this.Roles = Manager.GetRealRoleNames(this.DesiredRoles);
base.OnAuthorization(filterContext);
}
}
I'll leave the RoleManager up to you to implement and inject to your IOC Container. Now you simply use your new attribute instead of your old:
[ModifiedAuth(DesiredRoles = @"Read_V2_Group")]
public ActionResult Search()
{
return View();
}
Register your provider in the global.asax likes so:
var oldProvider = FilterProviders.Providers.Single(
f => f is FilterAttributeFilterProvider
);
FilterProviders.Providers.Remove(oldProvider);
FilterProviders.Providers.Add(new InjectibleFilterProvider(this.Container));