如果你需要在运行时注入不同的值,那么你可能应该看看使用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有,但他们看起来不像他们在我的解决方案中做任何事情。我需要在什么地方配置它们吗?这确实可以解决第二点。 –