繁体   English   中英

通过在服务帐户下运行的Web服务将用户名从C#本机应用程序传递到SQL Server的好方法

[英]Good ways to pass user name from C# native app to SQL Server via a web service running under a service account

我们公司有一个模型,其中所有Web服务都在其自己的特定服务帐户下运行。 例如:comp \\ Ws.App

该Web服务使用存储过程对SQL数据库执行所有数据库交互,并且该服务帐户具有这样做的所有权利。

我们有一个用C#编写的本地客户端,该客户端使用Web服务进行所有与数据相关的查询。

我的问题是,我们使用触发器对这些数据库表进行审核,这些触发器使用SQl函数中内置的USER_NAME()记录用户。

运行本机应用程序的用户名是否可以通过任何方式传递给SQL内置函数? 它不必是USER_NAME()函数,但是任何内置函数都足够。

我想避免的是以下情况:

  • 更改每个功能以传递用户名
  • 更改每个打开的连接语句以传递用户名

当前,我要做的是更改SQL连接字符串中的“ 应用程序名称”属性以包括用户身份,并将其从SQL函数内置的APP_NAME()中删除

笔记

  • 用户没有直接访问SQL Server的权限

还有其他好的解决方案吗?

一种选择是将用户ID存储在SQL Server上下文信息中。 一旦Web服务标识或认证了用户,然后Web服务便将用户ID存储在上下文信息中,这可以通过调用如下存储过程来完成:

CREATE PROCEDURE SetUserContext
    @UserId int
AS
    DECLARE @uc binary(4)
    SET @uc = CONVERT(binary(4), @UserId)
    SET CONTEXT_INFO @ci

然后,审核跟踪触发器使用如下代码从上下文信息中读取用户ID:

DECLARE @UserId int
SET @UserId = CONVERT(int, SUBSTRING(CONTEXT_INFO(), 1, 4))

当然,您需要在调用SetUserContext之后保持连接打开,如果关闭连接,则上下文信息将丢失。 因此,操作顺序应如下:

  1. 打开连接
  2. 呼叫SetUserContext
  3. 调用其他存储过程
  4. 紧密连接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM