2012-11-04 119 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