実行時に異なる値を挿入する必要がある場合は、おそらく IOC を使用してそれを行うことを検討する必要があります。デフォルトの FilterProvider を、IOC コンテナを使用する独自の実装に置き換えることができます。
ユニティ用の filterprovider の実装は次のとおりです。
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>);
}
}
次に、AuthorizeAttribute を少しだけラップする必要があります。
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);
}
}
RoleManager の実装と IOC コンテナへの注入は、あなたに任せます。これで、古い属性の代わりに新しい属性を使用するだけです:
[ModifiedAuth(DesiredRoles = @"Read_V2_Group")]
public ActionResult Search()
{
return View();
}
プロバイダーを global.asax に登録すると、次のようになります。
var oldProvider = FilterProviders.Providers.Single(
f => f is FilterAttributeFilterProvider
);
FilterProviders.Providers.Remove(oldProvider);
FilterProviders.Providers.Add(new InjectibleFilterProvider(this.Container));