自托管Katana服务实现模拟SQL Server连接?

时间:2016-03-08 15:44:52

标签: c# sql-server katana

我们使用Owin / Katana将我们的Web应用程序自托管为Windows服务。 HttpListener接受传入的连接并将其移交给Owin管道。

为了在Web前端实现集成身份验证,Windows服务需要以NetworkSystemLocalSystem运行,因为这些是唯一可以查询域控制器并验证用户身份的帐户凭证。

Windows服务还需要查询SQL Server数据库。但是,NetworkSystemLocalSystem都没有足够的权限连接到SQL Server,因此我们需要在连接到数据库时模拟其他域帐户。

为实现这一目标,我们尝试简单地实现我们自己的IDbConnection,该Open会在调用Dispose时模拟其他用户,然后在using (var conn = _connectionCreator.Create(_configuration.ConnectionString)) //this creates our own IDbConnection with impersonation built in { using (var cmd = _commandCreator.Create("mysproc", CommandType.StoredProcedure)) { conn.Open(); //here we switch to the user we're impersonating cmd.Connection = conn; //do the rest } } //call to Dispose here reverts the impersonation 上恢复该模拟,最后会使用类似的代码:

cmd.Connection = conn; //throws a cast exception

我们遇到的问题是下面的调用会抛出一个类强制转换异常:

cmd

事实证明,如果您的SqlCommand类型为Connection,那么SqlConnection对象的类型为SqlConnection

我们无法延长sealed,因为它是json4s

有人在查询SQL Server时遇到过冒充这种需要吗?如果是这样,你是如何解决它的(没有切换到IIS进行托管)?

1 个答案:

答案 0 :(得分:0)

如果其他人需要知道,我们最终通过实现分别包含IDbConnectionIDbCommand的{​​{1}}和SqlConnection的我们自己的版本来解决这个问题。实现两者都绕过了强制转换异常并允许我们添加模拟代码。

SqlCommand