Entity Framework 来自 .DSN 文件的连接字符串
Entity Framework connection string from .DSN file
我有一个问题,所以我想我会来找网络上最聪明的人。
我编写了一个 ASP.NET MVC 应用程序,它与另一个应用程序提供的 Web 服务交互。我的应用程序基本上只是向其他网络应用程序添加了一些功能。
两个应用程序都有一个数据库。我试图通过使用其他应用程序 SQL 服务器凭据来限制我的应用程序的配置。这样一来,如果他们决定更改其他应用程序的密码,我的就会开始工作。
这些凭据保存在我的应用程序可以访问的 .DSN 文件中。如何让使用 Entity Framework 的应用程序使用从 .DSN 文件中读取的详细信息创建的连接字符串?
我可以找出读取 .DSN 文件的代码,因此如果您想提供一些代码示例,您可以将它们设置为 EF 的连接字符串。
我也对其他解决方案持开放态度,甚至是我不应该这样做的原因。
提前致谢。
PS。当我写这篇文章时,我想出了一个小概念。我现在要测试一下,看看效果如何。但这是基础知识:
- 启动时,将所需的详细信息读入静态属性。
public MyContext() : base(getConnectionString()) { }
3.
private SomeObjectTypeHere getConnectionString()
{
//read static properties
//return .....something..... not sure yet....
}
可能有什么想法?
编辑
我创建了一个读取 .DSN 文件并获取服务器、用户 ID 和密码的方法。我现在将这些存储在静态属性中。在我的上下文中,既然我有所需的详细信息,我该如何设置我的连接字符串。
所以,我真正遇到的最大问题是如何在 Entity Framework 中设置我的连接字符串。但我也希望也许其他人使用过 .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; }
}
这很简单,是的,但我希望它可以为任何想做类似事情但不确定应该如何处理的人提供一些信息。
同样,如果您喜欢或不喜欢这个解决方案,请告诉我,如果您不喜欢它,请告诉我您的解决方案是什么以及为什么。
再次感谢!
我有一个问题,所以我想我会来找网络上最聪明的人。
我编写了一个 ASP.NET MVC 应用程序,它与另一个应用程序提供的 Web 服务交互。我的应用程序基本上只是向其他网络应用程序添加了一些功能。
两个应用程序都有一个数据库。我试图通过使用其他应用程序 SQL 服务器凭据来限制我的应用程序的配置。这样一来,如果他们决定更改其他应用程序的密码,我的就会开始工作。
这些凭据保存在我的应用程序可以访问的 .DSN 文件中。如何让使用 Entity Framework 的应用程序使用从 .DSN 文件中读取的详细信息创建的连接字符串?
我可以找出读取 .DSN 文件的代码,因此如果您想提供一些代码示例,您可以将它们设置为 EF 的连接字符串。
我也对其他解决方案持开放态度,甚至是我不应该这样做的原因。
提前致谢。
PS。当我写这篇文章时,我想出了一个小概念。我现在要测试一下,看看效果如何。但这是基础知识:
- 启动时,将所需的详细信息读入静态属性。
public MyContext() : base(getConnectionString()) { }
3.
private SomeObjectTypeHere getConnectionString()
{
//read static properties
//return .....something..... not sure yet....
}
可能有什么想法?
编辑 我创建了一个读取 .DSN 文件并获取服务器、用户 ID 和密码的方法。我现在将这些存储在静态属性中。在我的上下文中,既然我有所需的详细信息,我该如何设置我的连接字符串。
所以,我真正遇到的最大问题是如何在 Entity Framework 中设置我的连接字符串。但我也希望也许其他人使用过 .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; }
}
这很简单,是的,但我希望它可以为任何想做类似事情但不确定应该如何处理的人提供一些信息。
同样,如果您喜欢或不喜欢这个解决方案,请告诉我,如果您不喜欢它,请告诉我您的解决方案是什么以及为什么。
再次感谢!