【问题标题】:Entity Framework Windows Authentication with ASP.NET Impersonation使用 ASP.NET 模拟的实体框架 Windows 身份验证
【发布时间】:2014-12-21 06:14:45
【问题描述】:

我有一个使用模拟的 ASP.NET 应用程序。我的ConnectionStrings 是使用EntityConnectionStringBuilder 动态生成的。

当我使用SQL Server Authentication 时它工作正常,但是当我使用Windows Authentication 将用户ID 和密码替换为Trusted_Connection=Yes; 时,我收到一条错误消息“System.Data.SqlClient.SqlException (0x80131904): 无法打开登录请求的数据库“DB_Name”。登录失败。 用户“DomainName\MachineName$”登录失败。

看起来 Entity Framework 使用的是内置用户帐户 (MachineName$),而不是模拟用户“DomainName\User1”。

如何配置 EF 以使用模拟用户帐户进行 Windows 身份验证?

【问题讨论】:

    标签: c# asp.net sql-server entity-framework authentication


    【解决方案1】:

    您没有使用模拟。如果是,那么这将起作用(假设您的数据库已正确配置为允许来自模拟用户的访问)。

    EF 未使用“内置”帐户。它使用工作进程正在运行的任何帐户,在大多数情况下将是应用程序池身份或网络服务,两者都使用计算机 Active Directory 帐户作为凭据。

    换句话说,EF 使用连接字符串告诉它使用的任何东西,如果你告诉它使用受信任的连接,那么它会使用进程/线程在其下运行的任何东西。

    事实上,在集成管道模式下运行时,IIS7 或更高版本不支持模拟。这样做的原因是 IIS7 与 .NET 的联系更加紧密,并且支持异步处理程序。异步处理程序存在模拟问题,因为启动处理程序的线程可能与在放弃执行异步工作后异步请求恢复时恢复处理程序的线程不同。

    一般来说,除非您有非常具体的用例,否则您可能不应该将架构设计为需要模拟,因为这会产生很多影响。

    如果您需要使用特定用户的资源,那么您可以使用 WindowsIdentity 主体并以这种方式模拟,但这必须在一个小块(网络调用本身)的范围内完成。

    我不确定您是如何尝试模拟的,但它显然不起作用。在大多数情况下,如果您尝试在 IIS7+ 上进行模拟,您应该会遇到错误,所以问题是……是什么让您认为您在使用模拟?

    【讨论】:

    • 您的回答对我来说很有意义。我在IIS 8.5 上运行此应用程序,并在Windows Server 2012 R2 上运行。我的web.config 中有<authentication mode="Windows"/> <identity impersonate="true" userName="DomainName\User" password="MyPassword"/>System.Security.Principal.WindowsIdentity.GetCurrent().Name 返回当前用户名。如果我删除设置,它会显示ApplicationPoolIdentityApplicationPoolIntegrated Mode 中,身份设置为ApplicationPoolIdentity
    • @LibinTK - 这没有多大意义,您应该会看到如下错误:stackoverflow.com/questions/12966286/… 这告诉我您在某处配置错误......您确定它处于集成管道模式?除非你用<validation validateIntegratedModeConfiguration="false" /> 绕过了这个,在这种情况下你不会得到错误,但是模拟将无法正常工作。
    • @LibinTK - 但是,由于您在 web.config 中明确设置用户名(而不是简单地使用登录用户的用户凭据),所以您应该做的是运行作为该用户的应用程序池。将应用程序池标识更改为您想要的用户名。您还误解了登录用户和应用程序池身份之间的区别。 EF 使用当前线程的标识,通常是 App Pool 标识,与登录用户无关。
    • @ErikFunkenbysch 我确信应用程序池处于集成管道模式而不是经典模式。我的web.config 中也没有<validation validateIntegratedModeConfiguration="false" />
    • @ErikFunkenbysch 我已经从web.config 中删除了身份设置并更改了AppPoolIdentity。它工作正常。
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2014-09-08
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多