2015-12-10 23 views
1

我的配置有連接字符串與加密的密碼。代碼使用實體框架System.Data.Entity.DbContext,它保存加密的密碼。 如何自定義System.Data.Entity.DbContext.Database.Connection.ConnectionString以使用解密的密碼。需要自定義解密密碼爲System.Data.Entity.DbContext

下面的代碼DrcMaster被拋出埃羅:登錄失敗(因爲它試圖使用加密密碼)

using System; 
using System.Data.Entity; 
using System.Configuration; 

namespace DrcAuthentication.Database.User { 
    public class UserContext : DbContext 
    { 
     public UserContext() 
     { 
      System.Data.SqlClient.SqlConnectionStringBuilder csb = new System.Data.SqlClient.SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["UserContext"].ConnectionString.ToString()); 
      csb.Password = EncryptionUtils.Decrypt(csb.Password); 
      string myCs = csb.ToString(); 
      Database.Connection.ConnectionString = myCs; 
      //db.Database.Connection.ConnectionString = myCs; 
      this.Configuration.LazyLoadingEnabled = false; 
      this.Configuration.ProxyCreationEnabled = false; 
     } 

     public DbSet<DrcAuthentication.DrcMaster> DrcMasters { get; set; } 
     public DbSet<DrcAuthentication.AuthenticatedUser> Users { get; set; } 
     public DbSet<DrcAuthentication.UserRole> UserRoles { get; set; } 
     //public IDbSet<SuperSecured> SuperSecured { get; set; } 
    } 
} 
+0

解密後,'myCs'是否包含有效的連接字符串? –

回答

3

不要使用Database.Connection.ConnectionString設置連接字符串。 DbContext類有一個接受連接字符串的構造函數。您可以將其取得上述連接字符串,並將其解密的靜態方法的邏輯,然後從UserContext這樣的構造函數構造基DbContext類:

public class UserContext : DbContext 
{ 
    public static string GetConnectionString() 
    { 
     System.Data.SqlClient.SqlConnectionStringBuilder csb = new System.Data.SqlClient.SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["UserContext"].ConnectionString.ToString()); 
     csb.Password = EncryptionUtils.Decrypt(csb.Password); 
     string myCs = csb.ToString(); 
     return myCs; 
    } 

    public UserContext() 
     :base(GetConnectionString()) 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
     this.Configuration.ProxyCreationEnabled = false; 
    } 



    public DbSet<DrcAuthentication.DrcMaster> DrcMasters { get; set; } 
    public DbSet<DrcAuthentication.AuthenticatedUser> Users { get; set; } 
    public DbSet<DrcAuthentication.UserRole> UserRoles { get; set; } 
    //public IDbSet<SuperSecured> SuperSecured { get; set; } 

} 

不過,我會建議,而不是做的這將獲取和解密連接字符串的責任移到另一個類。這使得UserContext類是這樣的:

public class UserContext : DbContext 
{ 
    public UserContext(string connection_string) 
     :base(connection_string) 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
     this.Configuration.ProxyCreationEnabled = false; 
    } 

    public DbSet<DrcAuthentication.DrcMaster> DrcMasters { get; set; } 
    public DbSet<DrcAuthentication.AuthenticatedUser> Users { get; set; } 
    public DbSet<DrcAuthentication.UserRole> UserRoles { get; set; } 
    //public IDbSet<SuperSecured> SuperSecured { get; set; } 

} 

然後,另一班會注入解密的連接字符串到UserContext類。

+0

非常感謝..它工作得很好..讚賞它 – Naj

+0

嗨@Naj。如果此答案已解決您的問題,請點擊複選標記,考慮[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。沒有義務這樣做。 –