从模拟wcf服务访问sql server时,用户'NT AUTHORITY \\ ANONYMOUS LOGON'登录失败

时间:2013-07-12 10:23:08

标签: asp.net sql-server wcf wcf-security

我使用的WCF服务存在一个非常具体的问题:

我有一个包含2个下拉列表的ASP.NET页面:

  • 第一个是从后面的ASP.NET代码填充的。
  • 另一个是通过jQuery ajax调用从WCF服务填充的。

他们都使用模拟作为登录用户转到SQL Server数据库。 这适用于所有客户,除了1个环境。 在尝试从WCF服务调用数据库时,我收到以下异常:

"Login failed for user 'NT AUTHORITY\\ANONYMOUS LOGON'.","StackTrace":"   
                at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)\u000d\u000a   
                at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)\u000d\u000a   
                at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)\u000d\u000a   
                at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)\u000d\u000a   
                at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)\u000d\u000a 
...

似乎由于某种原因,WCF服务使用匿名帐户访问数据库,尽管来自ASP.NET代码的调用仍然按预期工作,并使用预期帐户访问数据库。 连接字符串使用Integrated Security=SSPI。 它必须是我们缺少的一些特定于环境的配置,但是我无法看到委托和模拟直接从ASP.NET工作的内容。

有谁知道问题可能是什么?

修改 system.servicemodel部分:

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  <bindings>
  <webHttpBinding>
    <binding name="ServiceWebBindingName">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows"></transport>
      </security>
    </binding>
  </webHttpBinding>     
</bindings>
<behaviors>
  <endpointBehaviors>     
    <behavior name="HistoryReportingEndpointBehavior">
      <enableWebScript />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="HistoryReportingServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" impersonateCallerForAllOperations="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
    <service behaviorConfiguration="HistoryReportingServiceBehavior" name="ServiceLibrary.HistoryReporting">
    <endpoint address="" behaviorConfiguration="HistoryReportingEndpointBehavior" binding="webHttpBinding" bindingConfiguration="ServiceWebBindingName" name="HistoryReportingWebEndPoint" contract="ServiceLibrary.IHistoryReporting" />
  </service>    
</services>
</system.serviceModel>

1 个答案:

答案 0 :(得分:0)

您获得的错误可能是因为您的Web应用程序正在使用的IIS应用程序池在没有SQL Server权限的帐户下运行。将应用程序池帐户更改为可以访问SQL Server的帐户,问题应该消失。