1

我正在开发一个连接到数据库(在另一台机器上)的 ASP.NET 应用程序。当我尝试从我的机​​器连接时没有问题,当我将它部署到目标环境时,EF 返回一个异常:

The underlying provider failed on Open.System.Data.SqlClient.SqlException (0x80131904): Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'. at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, SqlConnection owningObject) at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout) at 

我的配置是:

    <authentication mode="Windows" />
    <customErrors mode="Off"></customErrors>
    <identity impersonate="true" />
    <security>
        <authentication>
            <windowsAuthentication useKernelMode="false">
                <extendedProtection tokenChecking="None" />
            </windowsAuthentication>
        </authentication>
    </security>

我的连接字符串是:

 <add name="pmgbicopEntities" connectionString="metadata=res://*/copDB.csdl|res://*/copDB.ssdl|res://*/copDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=[NAME]\devde;Initial Catalog=[NAME];Integrated Security=True;Trusted_Connection=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

如果我删除数据库指令 this.Page.User 是我当前的帐户(这是正确的!),但是当我通过 EF 打开新连接时,我变成“匿名”

我尝试模仿如下:

WindowsIdentity winId = (WindowsIdentity)HttpContext.Current.User.Identity;
WindowsImpersonationContext ctx = null;
try
{
  ctx = winId.Impersonate();
  //EF SOMETHING
}
catch (Exception exx)
{
}
finally
{
  if (ctx != null)
  ctx.Undo();
}

但我得到同样的异常“用户'NT AUTHORITY\ANONYMOUS LOGON'登录失败。”

我尝试更改应用程序池用户,尝试手动模拟但没有任何成功。

IIS 配置有一些我尝试启用和禁用的 kerberos 内容,但没有任何改变。

你有什么建议吗?我是否必须在机器之间启用诸如“信任”之类的功能?对于来自“假 IIS”的开发机器,我没有问题,但我的用户已在数据库上启用。

先感谢您。

4

1 回答 1

0

您的最终目标是什么:将用户凭据传递给 SQL 或使用预定帐户连接到 SQL?

以下是我必须配置 Kerberos 才能工作的设置(它允许您使用用户的帐户权限):

IIS 设置:

-Physical Path Credentials:  Application User (pass-through authentication)
-Physical Path Credential Logon Type:  Clear Text
-Application Pool ID:  Domain\ServiceAccount
-Integrated Windows Authentication:  Enabled
-Windows Authentication Providers:  Negotiate
-useAppPoolCredentials (found in Configuration Editor):  True

为 ServiceAccount 创建的 SPN: SETSPN -L Domain\ServiceAccount

HTTP/Our.WebSiteURL.com

如果您不想使用域服务帐户,请将其替换为 SPN 和应用程序池中的 Domain\MachineAccount。

于 2013-11-08T16:53:16.550 回答