我已经构建了一个小型MVC3应用程序,它根据环境(Dev / Prod)有一些不同的配置需求。
这主要分为两个方面:
权利:权限通过Active Directory组进行管理,但我的开发环境位于另一个域,然后是我的生产环境:
//
// GET: /Host/Search
[Authorize(Roles = @"WIN2012\Main_v2_Read")]
public ActionResult Search()
{
return View();
}
数据库连接:在Dev中,集成安全性很好。对于生产,应使用服务帐户:
< add name="MainContext" connectionString="Data Source=Main-DEV;Initial Catalog=Main;Integrated Security=True" providerName="System.Data.SqlClient" />
我该如何处理?
答案 0 :(得分:2)
要在不同的配置中使用不同的web.config,您必须交换此配置,并且在构建,发布,部署期间将使用此配置。您可以通过“构建”菜单底部的配置管理器更改活动配置。或者从绿色运行箭头后选择。
对于有关DataSource的web.congig转换,请阅读:
http://blog.discountasp.net/how-web-config-transformation-simplifies-web-deployment/
至于问题的第一部分,我建议使用自定义Authorize属性,该属性将您的代码中的一些预定义角色名称交换为web.config中保存的等效名称。 这将更容易完成,因为您可以拥有更多环境,并为每个环境提供不同的web.config转换。
答案 1 :(得分:1)
如果需要在运行时注入不同的值,那么您可能应该考虑使用IOC来执行此操作。您可以使用自己的实现替换默认的FilterProvider,它使用IOC容器。
以下是unityprovider 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>);
}
}
然后你只需要稍微包装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));
答案 2 :(得分:0)
我会选择这个解决方案: Specifying Roles in web.config of an asp.net MVC application
然后使用带有一组设置的debug.web.config和带有生产设置的release.web.config。应该轻而易举:)