我们使用Owin / Katana将我们的Web应用程序自托管为Windows服务。 HttpListener
接受传入的连接并将其移交给Owin管道。
为了在Web前端实现集成身份验证,Windows服务需要以NetworkSystem
或LocalSystem
运行,因为这些是唯一可以查询域控制器并验证用户身份的帐户凭证。
Windows服务还需要查询SQL Server数据库。但是,NetworkSystem
和LocalSystem
都没有足够的权限连接到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进行托管)?
答案 0 :(得分:0)
如果其他人需要知道,我们最终通过实现分别包含IDbConnection
和IDbCommand
的{{1}}和SqlConnection
的我们自己的版本来解决这个问题。实现两者都绕过了强制转换异常并允许我们添加模拟代码。
SqlCommand