如果你需要在運行時注入不同的值,那麼你可能應該看看使用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));
在prod中,我總是使用集成安全性,其中的網站運行在一個應用程序池下作爲一個新的帳戶運行,只需要我想要的權限,但對一個不同的數據庫,所以你的問題被採取。 –
解決方案中沒有多個web.config文件。其中一個例子是prod和dev的細節。 (我依稀記得那樣的東西,雖然不能在我的平板電腦上測試它。) – Styxxy
@Styxxy有,但他們看起來不像他們在我的解決方案中做任何事情。我需要在什麼地方配置它們嗎?這確實可以解決第二點。 –