如何使用 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服务器认证文章)

http://www.codeguru.com/csharp/.net/net_security/authentication/article.php/c19559/ASPNET-Mixed-Mode-Authentication.htm

http://mvolo.com/iis-70-twolevel-authentication-with-forms-authentication-and-windows-authentication/