Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net身份丢失模拟_C#_Asp.net_Async Await_Impersonation_Asp.net Identity 2 - Fatal编程技术网

C# ASP.Net身份丢失模拟

C# ASP.Net身份丢失模拟,c#,asp.net,async-await,impersonation,asp.net-identity-2,C#,Asp.net,Async Await,Impersonation,Asp.net Identity 2,我遇到了很多问题,每当我调用ASP.NETIdentity异步方法时,我都会从SQLServer获得拒绝访问的异常 下面返回一个用户: var user = (from u in ctx.Users where u.Id == 1 select u).FirstOrDefault(); 鉴于 var user = await userManager.FindByIdAsync(1); 触发异常 System.Data.SqlClient.Sql

我遇到了很多问题,每当我调用ASP.NETIdentity异步方法时,我都会从SQLServer获得拒绝访问的异常

下面返回一个用户:

var user = (from u in ctx.Users
            where u.Id == 1
            select u).FirstOrDefault();
鉴于

var user = await userManager.FindByIdAsync(1);
触发异常

System.Data.SqlClient.SqlException: Login failed for user 'DOMAIN\MACHINE$'.
似乎正在发生的是,我们在web.config配置/system.web部分中有以下行

<identity impersonate="true" userName="DOMAIN\Domain User" password="xxx" />

此模拟用户具有访问SQL Server数据库的权限,但应用程序池用户没有。似乎每当我在ASP.Net Identity中调用异步方法时,它都会返回到应用程序池用户并丢失模拟

我确实发现了一个类似的问题,并在这里进行了解释

这也会导致我的问题吗

除了将应用程序池用户更改为具有数据库访问权限的用户之外,还有其他解决方法吗

使用web.config设置模拟用户是否是一种旧的做法,而现在却是一种糟糕的做法

编辑:经过进一步调查,我发现了这些文章


除非有人告诉我使用模拟是个坏主意。

集成管道模式不再支持模拟。尤其是在使用异步方法时

原因是模拟发生在线程上,当您调用异步函数时,它实际上可能在不同的线程上执行或返回

您应该使用WindowsImpersonationContext包装数据库调用


请确保在using块中执行此操作,因为如果代码中出现未捕获的异常,您将无法恢复原始上下文,并产生安全问题。

我的解决方案最终是在应用程序池中设置用户,而不是使用模拟。 这似乎与在Web.config中使用同等安全性设置模拟的效果完全相同,只是在使用Async时没有问题

正如@Erik在他的回答中所说的那样,模仿似乎不再受到支持,而且也不再符合法律
它从一开始就不被鼓励。

mayhelp@Yuval这看起来和我现在遇到的问题一样,但我正在开发的web应用程序将由其他公司的IT部门(技能水平不同)安装在IIS服务器上,IIS服务器也可能承载其他应用程序,因此修改任何全局设置都是不实际的。很高兴知道我不是唯一一个有这些问题的人,尽管.web.config不是一个全局设置;它只适用于运行相关应用程序的应用程序池。@Claies我没有注意到它显示了web.config。我之前发现了该设置,并在web.config中尝试了该设置,但未成功(当我使用SecurityContext.IsFlowSuppressed进行检查时,它不会影响该设置),这表示该设置仅适用于iis aspnet.config。是否有“不再支持集成管道模式”的源?无法包装数据库调用,因为数据库调用位于ASP.Net Identity/Entity framework中,这是我的问题的根源。我需要进一步调查,但我可能能够删除模拟,而不是更改应用程序池标识。web应用程序比我在我的公司早,并且一直使用web.config模拟,我需要检查是否有技术原因。@Mog0-这毫无意义。您不能使用非Windows标识来模拟,因此您的标识基于Windows标识,或者基于非Windows标识,并且您不能模拟非Windows标识,因此您与数据库的连接将无法工作。如果您要使用特定的网络用户访问数据库,则只需将应用程序池标识设置为使用所需的标识即可。设置应用程序池用户等同于在web.config中设置模拟用户,但我们的产品安装在客户网站上,有时IT人员并不总是像他们应该的那样专业。问题是,自动设置应用程序池用户(设置web.config很容易)对我们来说有多容易,以及是否有任何客户会有任何政策阻止它(一些客户有奇怪的限制)。
using System.Security.Principal;
...

//Get the identity of the current user
IIdentity contextId = HttpContext.Current.User.Identity;
WindowsIdentity userId = (WindowsIdentity)contextId;

//Temporarily impersonate
using (WindowsImpersonationContext imp = userId.Impersonate())
{
    //Perform tasks using the caller's security context
    DoSecuritySensitiveTasks();
}