2016-11-08 8 views
0

Visual StudioでビルドされたC#でSQL Serverアプリケーションを作成しています。これはWindowsフォームアプリケーションです。プログラムは、ユーザーが実行するネットワーク上にインストールされます。私の構成ファイルを保護する方法

私が苦労している問題は、設定ファイルを管理する方法です。そこにはサーバーのユーザー名とパスワードがすべて表示されます。私はClick Onceと暗号化方式を試しましたが、プログラムを実行していたコンピュータでプログラムを実行する必要がありました。私はワークステーションからそれを実行しようとしたときに失敗しました。これはHow do I avoid having the database password stored in plaintext in sourcecode?とは異なります。これらのソリューションはすべて、統合セキュリティまたはマシンベースの暗号化を使用することを提案しているためです。これらのオプションのどちらも私にとっては役に立たないでしょう。

ご協力いただければ幸いです。

+2

SQL認証を使用しないでください。データベースのWindows資格情報を使用します。 – jdweng

+2

クライアントがサーバのコードにアクセスすることができず、サーバメソッドのみを呼び出すことができるクライアント - サーバコードを書く... –

+0

[データベースコードをソースコードに保存するのを避けるには? http://stackoverflow.com/questions/42833/how-do-i-avoid-having-the-database-password-stored-in-plaintext-in-sourcecode) –

答えて

1

パスワードをプレーンテキストで保存しないでください。期間。完全停止。

SQL Serverから手がかりを得る必要があります。はい、あなたはです。は、Web/app.configにプレーンテキストのパスワードでユーザー名を格納します。しかし、プロダクションサーバの場合は、決してしないでください。プロダクションの展開ではなく、統合セキュリティを使用する設定が必要です。これにより、設定ファイルで安全ではなくWindowsによって安全に処理される資格情報にアクセスすることで、アクセスの向上が可能になります。

同様に、WindowsIdentityまたはOpenIdのようなものを使用する必要があります。その後、資格情報をプレーンテキストに格納するのではなく、コード内の認証トークンを渡すことができます。

0

データがapp.configの場合、それは簡単です!あなたはこの2つのクラスを使用する必要があります。

EntityConnectionStringBuilder 

https://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnectionstringbuilder(v=vs.110).aspx そして

SqlConnectionStringBuilder 

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder(v=vs.110).aspx

を私は、このページからそれを学ぶ:Programmatic Connection Strings in Entity Framework 6それは非常に良いガイドです。いずれの場合でも、そのリンクはあなたを助けなかった!このようなだけで、Googleの何か:

C#はランタイムあなたのコード内のすべての接続文字列を入れた後

で接続文字列を定義し、あなたが行くと、あなたのアプリが使用することはありませんので、app.configファイルのconnectionStringsタグから機密データを削除することができますそれはもう!次に、コードを再度コンパイルします。

あなたがEFでDBファーストを使用している場合は、あまりにもこのガイドをチェックすることができます:更新されたHow to set Connection String with Entity Framework

は私が管理し、それらのプログラムで接続文字列を作成し、私のクラスのうちの2つを追加します(ダイナミック)、1つはSQL Server Compact Edition(SQL Server CE)を使用したEntity Frameworkプロジェクトに属し、もう1つはSQL Server Express 2014(saユーザー名)を使用した別のエンティティフレームワークプロジェクトに属します。私は誰もがそれらを必要とする場合には、ここで両方の方法を残します:

をこれは私のSQL Server CEプロジェクトに属しています

public static string GetDBConnectionString(string dataParentPath = "") 
{ 
    EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
    SqlCeConnectionStringBuilder sqlCEBuilder = new SqlCeConnectionStringBuilder(); 

    if (string.IsNullOrEmpty(dataParentPath) == true) 
     dataParentPath = @"C:\MyDBFolder\CMS.sdf"; 

    sqlCEBuilder.DataSource = dataParentPath; 
    sqlCEBuilder.Password = "12345687"; 
    sqlCEBuilder.MaxDatabaseSize = 4090; 

    entityBuilder.Metadata = "res://*/CMS.csdl|res://*/CMS.ssdl|res://*/CMS.msl"; 
    entityBuilder.ProviderConnectionString = sqlCEBuilder.ToString(); 
    entityBuilder.Provider = "System.Data.SqlServerCe.4.0"; 

    return entityBuilder.ToString(); 
} 

を。これは、SQL Server認証と私のSQL Server Expressのプロジェクトに属している:

using System; 
using System.Collections.Generic; 
using System.Data.Entity.Core.EntityClient; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace CMS 
{ 
    class mySettings 
    { 
     public static string GetDBConnectionString() 
     { 
      // ************************************************** 
      // This is my "ConnectionString" from App.config file. 
      // <connectionStrings> 
      //  <add name="CMSEntities" 
      //   connectionString= 
      //    "metadata=res://*/CMS.csdl|res://*/CMS.ssdl|res://*/CMS.msl 
      //     ;provider=System.Data.SqlClient 
      //     ;provider connection string=&quot 
      //     ;data source=MY-PC\SQLEXPRESS 
      //     ;initial catalog=CMS 
      //     ;user id=sa 
      //     ;password=12345687 
      //     ;MultipleActiveResultSets=True 
      //     ;App=EntityFramework 
      //    &quot;" 
      //  providerName="System.Data.EntityClient" /> 
      //</connectionStrings> 
      // ************************************************** 

      string metaData = "res://*/CMS.csdl|res://*/CMS.ssdl|res://*/CMS.msl"; 
      string providerName = "System.Data.SqlClient"; 

      string dataSource = @"MY-PC\SQLEXPRESS"; 
      string databaseName = "CMS"; // = InitialCatalog 
      string userID = "sa"; 
      string password = "12345687"; 
      string appName = "EntityFramework"; 

      EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
      SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(); 

      // = = = = = = = = = = = = = = = = 
      sqlBuilder.DataSource = dataSource; 
      sqlBuilder.InitialCatalog = databaseName; 
      sqlBuilder.MultipleActiveResultSets = true; 
      sqlBuilder.UserID = userID; 
      sqlBuilder.Password = password; 
      sqlBuilder.ApplicationName = appName; 


      // = = = = = = = = = = = = = = = = 
      entityBuilder.Provider = providerName; 
      entityBuilder.Metadata = metaData; 
      entityBuilder.ProviderConnectionString = sqlBuilder.ConnectionString; 

      return entityBuilder.ToString(); 
     } 
    } 
} 

ご覧のとおり、両方のプロジェクトのMyデータベースの名前は「CMS」なので、エンティティの名前は「CMSEntities」となります。今すぐ! DbContextコンストラクタをオーバーライドする必要があります。重要ですが最も簡単な部分です!私のより良い説明は、このページ「http://www.cosairus.com/Blog/2015/3/10/programmatic-connection-strings-in-entity-framework-6」からです:

今すぐあなたのエンティティモデルは、DbContextから延び、DbContextは、接続文字列を渡すために コンストラクタを提供していますが、あなたのエンティティモデルが あなたのため、これらのコンストラクタをオーバーロードしません。 。 コンストラクタのオーバーロードにアクセスするには、 の新しいクラスパーシャルを、 エンティティモデルと同じ名前空間にエンティティモデルデータベースコンテキストを作成する必要があります。プロのヒント: は、将来生成されるコード が変更を上書きしない場合に、エンティティ モデルデータベースコンテキストとは異なる名前でcsファイルのファイル名を指定するようにしてください。

だから私は私のプロジェクトのルートでクラスを構築し、クラスがpartialでなければなりません:

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace CMS // Your Project Namespace 
{ 
    public partial class CMSEntities : DbContext 
    { 
     public CMSEntities(string connectionString) 
      : base(connectionString) 
     { 
     } 
    } 
} 

といつでも私はこのコードを使用します私のデータベースへのアクセスをしたい:

using (CMSEntities db = new CMSEntities(CMSSettings.GetDBConnectionString())) 
    { 
     // Do your DB stuff here... 
    } 

私はこのサイト「stackoverflow」とユーザーからそのすべてを学ぶあなたや他の人を助けてくれることを願っています。

グッドラック

+0

この徹底的な答えをありがとう。これを行った場合、データソースウィザードはデータベースにアクセスできないでしょうか? – Missy

+1

いいえ、このメソッドは実行時(デバッグ、リリース)でのみ使用されます。あなたはそれを試すことができます。さらにInfoが必要な場合は、[エンティティフレームワーク6のプログラム接続文字列](http://www.cosairus.com/Blog/2015/3/10/programmatic-connection-strings-in- entity-framework-6) 私が言及したように、私は2つのプロジェクトで問題なく使用します。また、自分のコード内で自分のパスワードを暗号化します。あなたが好きなら、もっと安全にすることができます! – MRK

+1

btw、あなたの歓迎!私はこのサイトや他のサイトからすべてのことを学ぶだけで、私は再共有することができます。私はこれらの方法があなたにも役立つことを願っています。ありがとう。 – MRK

1

ソフトウェア開発者は、Webサービスなどのミドルウェア・サービスを含むマルチティア・デザインを作成した理由です。 WebサービスはIISでホストされ、Windowsアカウントとパスワードはアプリケーション接続プールのアプリケーションIDセクションに構成できます。次に、web.config接続文字列をtrusted_connection = trueで設定できます。このように構成すると、Windows Data Protection APIを使用してIDを保護します。

関連する問題