1

私は、環境(Dev / Prod)に基づいていくつかの異なる構成ニーズを持つ小さなMVC3アプリケーションを構築しました。

これは主に2つの領域にあります。

  1. 権利:権利はActive Directoryグループを介して管理されますが、開発環境は本番環境とは別のドメインにあります。

    //
    // GET: /Host/Search
    [Authorize(Roles = @"WIN2012\Main_v2_Read")]
    public ActionResult Search()
    {
        return View();
    }
    
  2. データベース接続:開発では、統合セキュリティは問題ありません。本番環境では、サービスアカウントを使用する必要があります。

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

これをどのように処理すればよいですか?

4

3 に答える 3

2

異なる構成で異なるweb.configを使用するには、この構成を交換する必要があり、ビルド、公開、デプロイ中にこの構成が使用されます。ビルドメニューの下部にある構成マネージャーからアクティブな構成を変更できます。または、緑色の実行矢印の直後の選択から。

DataSourceに関するweb.congig変換については、以下をお読みください。

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

質問の最初の部分については、事前定義されたロール名の一部をコードからweb.configに保存されているものと同等のものに交換するカスタムのAuthorize属性をお勧めします。これは、環境だけでなく、環境ごとに異なるweb.config変換を使用できるため、簡単に実行できます。

于 2012-11-14T10:25:40.483 に答える
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));
于 2012-11-13T13:59:38.367 に答える
0

私はこの解決策に行きます: asp.net MVCアプリケーションのweb.configで役割を指定する

次に、設定の 1 つのセットで debug.web.config を使用し、運用設定で release.web.config を使用します。簡単に動作するはずです:)

于 2012-11-16T14:04:09.350 に答える