2011-11-17 29 views
16

Tôi đã làm theo hướng dẫn này về cách tạo dịch vụ OData.Cách nhập mã cung cấp mật khẩu cho chuỗi kết nối trong Mô hình dữ liệu thực thể ADO.Net

http://www.hanselman.com/blog/CreatingAnODataAPIForStackOverflowIncludingXMLAndJSONIn30Minutes.aspx

Và nó hoạt động hoàn hảo ... nhưng, trong Entity Data Model Wizard, khi nó yêu cầu bạn "Chọn Kết nối dữ liệu của bạn" nó mang lại cho bạn cảnh báo này.

"Chuỗi kết nối này dường như chứa dữ liệu nhạy cảm (ví dụ: mật khẩu) cần thiết để kết nối với cơ sở dữ liệu. Lưu trữ dữ liệu nhạy cảm trong chuỗi kết nối có thể là một nguy cơ bảo mật. trong chuỗi kết nối? "

Nếu tôi chọn: "Không, hãy loại trừ dữ liệu nhạy cảm khỏi chuỗi kết nối. Tôi sẽ đặt nó trong mã ứng dụng của tôi".

Tôi không thấy nơi tôi có thể, "trong mã ứng dụng của tôi" chèn mật khẩu. (Công ty của tôi lưu trữ chúng được mã hóa trong sổ đăng ký)

Ngoài ra, tôi có nhiều DB mà tôi cần kết nối, tùy thuộc vào môi trường (Dev, CA hoặc Prod) và tôi cần biết DB nào được tham chiếu trong chuỗi kết nối để nhận mật khẩu chính xác.

Cảm ơn.

+0

Làm thế nào để * trong mã .. *, một từ ngữ hay của câu hỏi:) – Irfan

Trả lời

27

Khi bạn tạo ngữ cảnh, bạn có thể đặt chuỗi kết nối. Để xây dựng chuỗi kết nối này, bạn có thể phân tích chuỗi kết nối mà không cần mật khẩu bằng EntityConnectionStringBuilder và sau đó phân tích cú pháp chuỗi kết nối bên trong bằng một số khác ConnectionStringBuilder, tùy thuộc vào trình duyệt của bạn. Sau đó, bạn có thể đặt mật khẩu và chuyển nó cho hàm tạo.

var originalConnectionString = ConfigurationManager.ConnectionStrings["your_connection_string"].ConnectionString; 
var entityBuilder = new EntityConnectionStringBuilder(originalConnectionString); 
var factory = DbProviderFactories.GetFactory(entityBuilder.Provider); 
var providerBuilder = factory.CreateConnectionStringBuilder(); 

providerBuilder.ConnectionString = entityBuilder.ProviderConnectionString; 

providerBuilder.Add("Password", "Password123"); 

entityBuilder.ProviderConnectionString = providerBuilder.ToString(); 

using (var context = new YourContext(entityBuilder.ToString())) 
{ 
    // TODO 
} 
+2

Cảm ơn! Một trong những mảnh mà không thực hiện điều này "Plug-and-play" là nơi để đặt mã này.Cuối cùng tôi nhận ra rằng tôi cần phải ghi đè lên DataService CreateDataSource() – saunderl

+2

Khi bạn ghi đè lên DataService CreateDataSource(), nó sẽ là công khai hay riêng tư? –

9

Sửa đổi các constructor của các đối tượng

public sampleDBEntities() : base("name=sampleDBEntities") 
    { 
     this.Database.Connection.ConnectionString = @"Data Source=.\;Initial Catalog=sampleDB;Persist Security Info=True;User ID=sa;Password=Password123"; ; 
    } 
3

ứng dụng mẫu của tôi được viết trong "Cơ sở dữ liệu đầu tiên" chế độ và "CreateNewConnectionString" phương pháp dưới đây chỉ hoạt động tốt (mặc dù nó không giống tất cả những gì thanh lịch.)

Phương thức "CreateNewConnectionString2" trông thực sự thanh lịch, NHƯNG gây ra ngoại lệ cho tôi biết nó chỉ hợp lệ trong chế độ "Mã đầu tiên".

Vì vậy, tôi cung cấp cả hai phương pháp cùng với hàm tạo mà tôi đã sửa đổi để sử dụng các phương pháp của mình. LƯU Ý VÀ BEWARE, tôi đã sửa đổi mã được tạo ra bởi một mẫu và có thể bị ghi đè nếu mã được tái tạo. Đối với tôi, nó có vẻ như là nơi thích hợp để đặt nó.

Nếu ứng dụng của bạn được tạo ra trong chế độ "Mã đầu tiên", bạn có thể cần phải sử dụng "CreateNewConnectionString2" (Tôi vẫn chưa kiểm tra tùy chọn này.)

tôi đẩy nhanh phải thừa nhận rằng chúng tôi đã copy cả hai khối mã từ khác các bài đăng như tôi chưa biết gần đủ về tất cả điều này để viết mã của riêng tôi.

private static string CreateNewConnectionString(string connectionName, string password) 
     { 
     var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~").ConnectionStrings.ConnectionStrings[connectionName]; 
     //or: 
     //var config = ConfigurationManager.ConnectionStrings[connectionName]; 
     var split = config.ConnectionString.Split(Convert.ToChar(";")); 
     var sb = new System.Text.StringBuilder(); 

     for (var i = 0; i <= (split.Length - 1); i++) 
     { 
      if (split[i].ToLower().Contains("user id")) 
      { 
       split[i] += ";Password=" + password; 
      } 

      if (i < (split.Length - 1)) 
      { 
       sb.AppendFormat("{0};", split[i]); 
      } 
      else 
      { 
       sb.Append(split[i]); 
      } 
     } 
     return sb.ToString(); 
    } 

    private static string CreateNewConnectionString2(string connectionName, string password) 
    { 
     var originalConnectionString = ConfigurationManager.ConnectionStrings[connectionName].ConnectionString; 
     var entityBuilder = new EntityConnectionStringBuilder(originalConnectionString); 
     var factory = DbProviderFactories.GetFactory(entityBuilder.Provider); 
     var providerBuilder = factory.CreateConnectionStringBuilder(); 

     providerBuilder.ConnectionString = entityBuilder.ProviderConnectionString; 

     providerBuilder.Add("Password", password); 

     entityBuilder.ProviderConnectionString = providerBuilder.ToString(); 
     return entityBuilder.ProviderConnectionString; 
    } 

    public ChineseStudyEntities() 
     : base(CreateNewConnectionString("ChineseStudyEntities", "put YOUR password here")) // base("name=ChineseStudyEntities") 
    { 
    } 
7

Tôi đã thêm một "dummy" mật khẩu trong tập tin cấu hình ("XXXXX"), sau đó thay thế giá trị với mật khẩu thực tế trong xây dựng tổ chức

public MyDatabaseContainer() : base("name=MyDatabaseContainer") 
{ 
    Database.Connection.ConnectionString = Database.Connection.ConnectionString.Replace("XXXXX","realpwd"); 
} 
Các vấn đề liên quan