asp.net模拟如何与System.Threading.Task一起使用?

Chr*_*yes 4 c# asp.net iis impersonation

我想使用客户端用户的凭据访问数据库。

我的代码:

Task.Run(() => 
{
        // Connect to DB.
}
Run Code Online (Sandbox Code Playgroud)

我在system.web节点中具有带有模拟属性的标识标签:

<identity impersonate="true" />
Run Code Online (Sandbox Code Playgroud)

我在system.webServer节点中具有验证标签:

<validation validateIntegratedModeConfiguration="false" />
Run Code Online (Sandbox Code Playgroud)

我将身份验证设置为Windows:

<authentication mode="Windows" />
Run Code Online (Sandbox Code Playgroud)

我在iis的应用程序中设置了模拟和窗口:

IIS设置

我已将应用设置为使用直通:

在此处输入图片说明

我已经重新启动了iis。

我对这种工作方式不知所措,或者完全误解了。

Ari*_*edi 5

根据您的评论,您似乎正在运行System.Security.Principal.WindowsIdentity.GetCurrent().Name一个Task,并且正在获取App Pool的身份,而不是模拟用户的身份。这是一个常见的问题(看看我前一段时间问过的这个问题)。

但是,有一种解决方法。如果仍然希望您的任务以模拟用户身份运行,则必须在任务运行之前保存当前用户的令牌,然后尝试“重新模拟”任务的上下文,如下所示:

IntPtr currentUser = WindowsIdentity.GetCurrent().Token; // This token points to the impersonated user

Task.Run(() => 
{
    using (WindowsIdentity.Impersonate(token))
    {
        // Connect to DB.
    }
}
Run Code Online (Sandbox Code Playgroud)

这样可以确保Using块中的所有内容都以模拟用户的身份运行。