2017-09-05 122 views
1

我有一個問題,所以我想我會來網上最聰明的頭腦。實體框架連接字符串從.DSN文件

我寫了一個ASP.NET MVC應用程序,它與另一個應用程序提供的Web服務接口。我的應用程序基本上只是增加了一些功能到其他Web應用程序

這兩個應用程序都有一個數據庫。我試圖通過使用其他應用程序SQL Server憑據來限制我的應用程序的配置。這是如此,如果他們決定更改其他應用程序的密碼,我的將開始工作。

這些憑據保存在我的應用程序可以訪問的.DSN文件中。我如何讓我的應用程序使用實體框架來使用從.DSN文件中讀取的詳細信息創建的連接字符串?

我可以找出讀取.DSN文件的代碼,因此如果您希望提供一些代碼示例,您可以將它們設置爲設置EF的連接字符串。

我也開放給其他解決方案,甚至爲什麼我不應該這樣做。

在此先感謝。

PS。在寫這篇文章時,我想出了一個小概念。我現在要測試它看看它是如何發展的。但這裏有基礎知識:

  1. 在啓動時,請將所需的詳細信息讀入靜態屬性。
  2. public MyContext() : base(getConnectionString()) { }

3.

private SomeObjectTypeHere getConnectionString() 
{ 
    //read static properties 
    //return .....something..... not sure yet.... 
} 

思考,也許?

編輯 我創建了一個讀取.DSN文件並獲取服務器,用戶標識和密碼的方法。我現在有這些存儲在靜態屬性。在我的上下文中,我現在可以如何設置連接字符串,並具有所需的詳細信息。

+0

我懷疑EF是否支持SQL Server DSN,爲什麼不試圖直接提供服務器憑證?你有沒有使用DB First與其他服務器實例連接? –

+0

是的,EF不支持DSN。我不想直接應用憑據的原因是我不想存儲它們。我只想使用其他應用程序使用的相同用戶。 – JohZant

+1

聽起來像你希望用戶使用每個憑證(即動態生成的連接字符串)訪問不同的數據庫,是嗎?我想你可以將DB連接字符串傳遞給實體局部類的構造函數。 –

回答

0

所以,我真的很具有最大的問題是如何設置的實體框架我的連接字符串。但我也希望也許有人曾經使用.DSN文件。

無論如何,這裏是我的解決方案。仍然在尋找可能由此產生的問題,所以如果你能看到任何問題,請告訴我!

首先,我創建了一個啓動時運行的方法。此方法運行.DSN文件並挑選出寶石。

請記住,我從來沒有與.DSN文件的工作,並得到密碼的部分是唯一的我的情況。

  var DSNFileContents = File.ReadAllLines(WebConfigurationManager.AppSettings["AppPath"] + @"\App.DSN");//reads DSN into a string array 

      //get UID 
      string uid = DSNFileContents.Where(line => line.StartsWith("UID")).First().Substring(4);//get UID from array 
      //test if uid has quotes around it 
      if (uid[0] == '"' && uid[uid.Length - 1] == '"') 
      { 
       //if to starts with a quote AND ends with a quote, remove the quotes at both ends 
       uid = uid.Substring(1, uid.Length - 2); 
      } 

      //get server 
      string server = DSNFileContents.Where(line => line.StartsWith("SERVER")).First().Substring(7);//get the server from the array 
      //test if server has quotes around it 
      if (server[0] == '"' && server[server.Length - 1] == '"') 
      { 
       //if to starts with a quote AND ends with a quote, remove the quotes at both ends 
       server = server.Substring(1, server.Length - 2); 
      } 

      //THIS WON'T WORK 100% FOR ANYONE ELSE. WILL NEED TO BE ADAPTED 
      //test if PWD is encoded 
      string password = ""; 
      if (DSNFileContents.Where(line => line.StartsWith("PWD")).First().StartsWith("PWD=/Crypto:")) 
      { 
       string secretkey = "<secret>"; 
       string IV = "<alsoSecret>"; 
       byte[] encoded = Convert.FromBase64String(DSNFileContents.Where(line => line.StartsWith("PWD")).First().Substring(12)); 
       //THIS LINE IN PARTICULAR WILL NOT WORK AS DecodeSQLPassword is a private method I wrote to break the other applications encryption 
       password = DecodeSQLPassword(encoded, secretkey, IV); 
      } 
      else 
      { 
       //password was not encrypted 
       password = DSNFileContents.Where(line => line.StartsWith("PWD")).First().Substring(4); 
      } 

      //build connection string 
      SqlConnectionStringBuilder cString = new SqlConnectionStringBuilder(); 
      cString.UserID = uid; 
      cString.Password = password; 
      cString.InitialCatalog = "mydatabase"; 
      cString.DataSource = server; 
      cString.ConnectTimeout = 30; 
      //statProps is a static class that I have created to hold some variables that are used globally so that I don't have to I/O too much. 
      statProps.ConnectionString = cString.ConnectionString; 

現在,我有連接字符串保存的,我只是有我的數據庫環境中使用它下面,

public class myContext : DbContext 
{ 
    public myContext() : base(statProps.ConnectionString) { } 

    //all my DbSets e.g. 
    public DbSet<Person> Persons{ get; set; } 


} 

這很簡單,是的,但我希望它可以提供一些信息任何人都希望做類似的事情,但不知道應該如何處理。

再次,讓我知道如果你喜歡或不喜歡這個解決方案,如果你不喜歡它,你的解決方案是什麼,爲什麼。

再次感謝!