【问题标题】:MVC3 Release StrategyMVC3 发布策略
【发布时间】:2012-11-04 21:31:03
【问题描述】:

我构建了一个小型 MVC3 应用程序,它根据环境(开发/生产)有一些不同的配置需求。

这主要是2个方面:

  1. 权限:权限通过 Active Directory 组管理,但我的开发环境位于另一个域中,然后是我的生产环境:

    //
    // GET: /Host/Search
    [Authorize(Roles = @"WIN2012\Main_v2_Read")]
    public ActionResult Search()
    {
        return View();
    }
    
  2. 数据库连接:在 Dev 中,集成安全性很好。对于生产,应使用服务帐户:

    < add name="MainContext" connectionString="Data Source=Main-DEV;Initial Catalog=Main;Integrated Security=True" providerName="System.Data.SqlClient" />
    

我应该如何处理?

【问题讨论】:

  • 在产品中,我总是使用集成安全性,其中网站在应用程序池下运行,作为新帐户运行,具有我想要的权限,但是是的,对于不同的数据库,所以你的问题很好采取。
  • 解决方案中没有多个 web.config 文件。例如,一个带有 prod 的详细信息,一个用于 dev 的详细信息。 (我依稀记得类似的东西,但无法在我的平板电脑上测试。)
  • @Styxxy 有,但它们看起来在我的解决方案中没有任何作用。我需要在某处配置它们吗?这确实可以解决第 2 点。
  • 您可以在这些配置文件中添加正确的配置部分(例如,在 dev 和 prod 的 web.config 中的 dev 和 prod 的数据库连接)。

标签: c# asp.net asp.net-mvc-3


【解决方案1】:

要在不同的配置中使用不同的 web.config,您必须交换此配置,并且在构建、发布、部署期间将使用此配置。您可以通过 Build 菜单底部的配置管理器更改活动配置。或从绿色运行箭头后的右侧选择。

对于有关 DataSource 的 web.congig 转换,请阅读:

http://blog.discountasp.net/how-web-config-transformation-simplifies-web-deployment/

至于问题的第一部分,我建议使用自定义 Authorize 属性,该属性会将您的一些预定义角色名称从您的代码交换为与 web.config 中保存的等效名称。 这将更容易实现,因为您可以拥有更多的环境,并且每个环境都具有不同的 web.config 转换。

【讨论】:

  • 绝对是 web.config 转换来处理连接字符串的变化,以及一个自定义的 Authorize 属性来处理 perms。 IoC 方法对于所需的功能来说过于复杂。
【解决方案2】:

如果您需要在运行时注入不同的值,那么您可能应该考虑使用 IOC 来执行此操作。您可以将默认的 FilterProvider 替换为您自己的实现,该实现使用 IOC 容器。

这里是统一过滤器的实现:

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));

【讨论】:

    【解决方案3】:

    我会选择这个解决方案: Specifying Roles in web.config of an asp.net MVC application

    然后使用带有一组设置的 debug.web.config 和带有生产设置的 release.web.config。应该轻而易举:)

    【讨论】:

      猜你喜欢
      • 2016-05-02
      • 1970-01-01
      • 2010-10-31
      • 2020-09-17
      • 2018-11-21
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多