如何使用 MVC/C# 创建最终用户 SQL 服务器连接对话框
How to create an end user SQL Server connection dialog using MVC/C#
我是 C# 和 MVC 的新手。尝试创建允许用户配置或更改初始 SQL 服务器连接字符串的 Intranet 应用程序。连接需要支持 SQL 混合模式身份验证。虽然我的后端技能非常出色,但这是我第一次尝试创建基于 Web 的 Intranet Web 应用程序。我一直在搜索 Google 3 天,试图找到示例、教程或文档,但没有成功。我什至不确定这是否是一种公认的做法。我正在使用 VS2015、SQL Server 2012、C#、MVC、ASP.Net 并针对 .Net Framework 4.61。任何指导表示赞赏。
可能您无法轻易地动态更改 web.config
中的 default/initial 连接字符串(并且认为直接在 web.config
上更改它是有害的),但是 SqlConnectionStringBuilder
可以构建您在 运行-time:
内请求的连接字符串
// assume these properties are part of DB provider definition
public class DatabaseSettings
{
public String ConnectionName { get; set; }
public String ServerName { get; set; }
public String DatabaseName { get; set; }
public String UserId { get; set; }
public String Password { get; set; }
}
// controller method definition
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = DatabaseSettings.ServerName;
builder.InitialCatalog = DatabaseSettings.DatabaseName;
builder.IntegratedSecurity = true;
builder.UserID = DatabaseSettings.UserId;
builder.Password = DatabaseSettings.Password;
builder.MultipleActiveResultSets = true;
// modify initial connection string in runtime
// note that ConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString is readonly by default,
// thus use reflection to disable private bReadOnly field before adding custom connection string
var connectionString = ConfigurationManager.ConnectionStrings;
var collection = typeof(ConfigurationElementCollection).GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
collection.SetValue(connectionString, false);
// This one may work if you tend to change default connection string value
// connectionString[0].ConnectionString = builder.ToString();
// Safer way by adding new name rather than replace default one
connectionString.Add(new ConnectionStringSettings(DatabaseSettings.ConnectionName, builder.ToString()));
据我所知,您可以将用户定义的连接字符串存储在每个用户的 XML 文件中,并在有人需要时以编程方式加载(参见 Reading connection string from external config file)。
关于混合模式(Windows & Intranet 和 Internet 的表单身份验证),将您的 IIS 设置为 2 个入口点(即虚拟目录),其中完整的应用程序应依赖表单身份验证模式。 Windows 身份验证的控制器只需传递用户身份即可重定向到主站点。
在您的主站点的登录页面上,您可能需要添加 "Login with Windows/Active Directory account" 按钮(类似于现有社交媒体帐户的登录按钮)并单击它会将 Intranet 用户重定向到专门设计用于从中接收凭据的控制器Windows 认证模式。
也许这不是满足您需求的最佳方式,但至少可以让您敞开心扉去学习和思考该做什么。
参考文献:
1) 以编程方式更改连接字符串
http://david.gardiner.net.au/2008/09/programmatically-setting.html
2) 双模认证
https://msdn.microsoft.com/en-us/library/bb669066(v=vs.110).aspx(MS SQL服务器认证文章)
我是 C# 和 MVC 的新手。尝试创建允许用户配置或更改初始 SQL 服务器连接字符串的 Intranet 应用程序。连接需要支持 SQL 混合模式身份验证。虽然我的后端技能非常出色,但这是我第一次尝试创建基于 Web 的 Intranet Web 应用程序。我一直在搜索 Google 3 天,试图找到示例、教程或文档,但没有成功。我什至不确定这是否是一种公认的做法。我正在使用 VS2015、SQL Server 2012、C#、MVC、ASP.Net 并针对 .Net Framework 4.61。任何指导表示赞赏。
可能您无法轻易地动态更改 web.config
中的 default/initial 连接字符串(并且认为直接在 web.config
上更改它是有害的),但是 SqlConnectionStringBuilder
可以构建您在 运行-time:
// assume these properties are part of DB provider definition
public class DatabaseSettings
{
public String ConnectionName { get; set; }
public String ServerName { get; set; }
public String DatabaseName { get; set; }
public String UserId { get; set; }
public String Password { get; set; }
}
// controller method definition
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = DatabaseSettings.ServerName;
builder.InitialCatalog = DatabaseSettings.DatabaseName;
builder.IntegratedSecurity = true;
builder.UserID = DatabaseSettings.UserId;
builder.Password = DatabaseSettings.Password;
builder.MultipleActiveResultSets = true;
// modify initial connection string in runtime
// note that ConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString is readonly by default,
// thus use reflection to disable private bReadOnly field before adding custom connection string
var connectionString = ConfigurationManager.ConnectionStrings;
var collection = typeof(ConfigurationElementCollection).GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
collection.SetValue(connectionString, false);
// This one may work if you tend to change default connection string value
// connectionString[0].ConnectionString = builder.ToString();
// Safer way by adding new name rather than replace default one
connectionString.Add(new ConnectionStringSettings(DatabaseSettings.ConnectionName, builder.ToString()));
据我所知,您可以将用户定义的连接字符串存储在每个用户的 XML 文件中,并在有人需要时以编程方式加载(参见 Reading connection string from external config file)。
关于混合模式(Windows & Intranet 和 Internet 的表单身份验证),将您的 IIS 设置为 2 个入口点(即虚拟目录),其中完整的应用程序应依赖表单身份验证模式。 Windows 身份验证的控制器只需传递用户身份即可重定向到主站点。
在您的主站点的登录页面上,您可能需要添加 "Login with Windows/Active Directory account" 按钮(类似于现有社交媒体帐户的登录按钮)并单击它会将 Intranet 用户重定向到专门设计用于从中接收凭据的控制器Windows 认证模式。
也许这不是满足您需求的最佳方式,但至少可以让您敞开心扉去学习和思考该做什么。
参考文献:
1) 以编程方式更改连接字符串
http://david.gardiner.net.au/2008/09/programmatically-setting.html
2) 双模认证
https://msdn.microsoft.com/en-us/library/bb669066(v=vs.110).aspx(MS SQL服务器认证文章)