2012-11-04 120 views
1

我已经构建了一个基于环境(Dev/Prod)具有一些不同配置需求的小型MVC3应用程序。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" /> 
    

我应该如何处理呢?

+1

在prod中,我总是使用集成安全性,其中的网站运行在一个应用程序池下作为一个新的帐户运行,只需要我想要的权限,但对一个不同的数据库,所以你的问题被采取。 –

+0

解决方案中没有多个web.config文件。其中一个例子是prod和dev的细节。 (我依稀记得那样的东西,虽然不能在我的平板电脑上测试它。) – Styxxy

+0

@Styxxy有,但他们看起来不像他们在我的解决方案中做任何事情。我需要在什么地方配置它们吗?这确实可以解决第二点。 –

回答

1

如果你需要在运行时注入不同的值,那么你可能应该看看使用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)); 
2

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

对于web.congig转换有关数据源读取听到:

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

至于问题,我会建议的自定义属性授权将掉你的一些预定义角色的名字从你的代码的那些等同的第一部分也保存在web.config中。 这将会更容易完成,因为您可以拥有更多的环境,并为每个环境提供不同的web.config转换。

+0

绝对要处理连接字符串更改的web.config转换以及处理烫发的自定义授权属性。 IoC方法对于所需的功能太复杂。 – Heather