【问题标题】:ASP.Net Identity losing ImpersonationASP.Net 身份丢失模拟
【发布时间】:2015-09-13 16:39:11
【问题描述】:

我遇到了很多问题,每当我调用 ASP.Net Identity Async 方法时,我都会收到来自 SQL 服务器的拒绝访问异常。

以下返回一个用户:

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 中调用异步方法时,它都会退回到应用程序池用户并失去模拟。

我确实在https://stackoverflow.com/a/30876110/1093406https://stackoverflow.com/a/30876110/1093406 找到了一个类似的带有解释的听起来问题

这也会导致我的问题吗?

除了将应用程序池用户更改为具有数据库访问权限的用户之外,还有什么办法可以解决这个问题?

使用 web.config 设置模拟用户是一种旧的做事方式,现在是不好的做法吗?

编辑:经过进一步调查,我发现了这些文章 http://www.hanselman.com/blog/AvoidUsingImpersonationInASPNET.aspx http://blog.codeishard.net/2012/09/17/await-async-mvc-and-impersonation/

除非有人能告诉我,否则使用模拟似乎是个坏主意。

【问题讨论】:

  • This 可能会有所帮助
  • @Yuval 这看起来和我遇到的问题一样,但是我正在开发的 Web 应用程序将由其他公司的 IT 部门(他们的技能水平不同)安装在 IIS 服务器上,并且IIS 服务器也可能托管其他应用程序,因此修改任何全局设置是不切实际的。很高兴知道我不是唯一遇到这些问题的人。
  • web.config 不是全局设置;它仅适用于运行相关应用程序的应用程序池。
  • @Claies 我没有注意到它说的是 web.config。我之前发现了该设置并在 web.config 中尝试它失败(当我检查 SecurityContext.IsFlowSuppressed 时它没有影响设置)并且这个 msdn.microsoft.com/en-us/library/6bs4szyc(v=vs.110).aspx 说它只适用于 iis aspnet.config。跨度>

标签: c# asp.net async-await impersonation asp.net-identity-2


【解决方案1】:

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

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

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

https://msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext(v=vs.110).aspx

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();
}

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

【讨论】:

  • 你有“集成管道模式不再支持”的来源吗?
  • 包装数据库调用是不可能的,因为数据库调用在 ASP.Net 身份/实体框架中,这是我的问题的根源。我需要进一步调查,但我可能能够删除模拟,而是更改应用程序池标识。该网络应用程序早于我在我的公司,并且一直使用 web.config 模拟,我需要检查是否有技术原因。
  • @Mog0 - 这没有任何意义。您不能使用非 Windows 身份进行模拟,因此您的身份基于 Windows 身份,或者它们基于非 Windows 身份,并且您不能模拟非 Windows 身份,因此您与您的数据库将无法正常工作。如果您打算使用特定的网络用户访问数据库,那么只需将 App Pool 身份设置为使用您需要的身份即可。
  • 设置应用程序池用户等同于在 web.config 中设置模拟用户,但我们的产品安装在客户站点,有时由 IT 人员安装,他们并不总是具备应有的技术水平。问题是我们自动设置应用程序池用户有多容易(设置 web.config 很容易),以及是否有任何客户有任何政策阻止它(有些有奇怪的限制)。
【解决方案2】:

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

正如@Erik 在他的回答中所说,似乎不再支持模仿,根据http://www.hanselman.com/blog/AvoidUsingImpersonationInASPNET.aspx 一开始就没有受到鼓励。

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 2012-02-25
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2015-05-24
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多