2017-02-18 13 views
0

Я используюНевозможно получить доступ к SQL Server из службы WCF (Windows проверки подлинности) от клиента (консольного приложения) в C#

  1. службы WCF (Windows проверку подлинности и олицетворения) (проверка подлинности Windows)
  2. SQL Server
  3. Console приложение (клиент)

Все в том же домене.

Я использую службу WCF с проверкой подлинности Windows из консольного приложения в качестве клиента. Однако, когда я пытаюсь получить доступ к SQL Server из консольного приложения с помощью службы WCF, я получаю сообщение об ошибке:

Exception In Account Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.

Мой сценарий: моя служба WCF и SQL Server находятся на одной системе (System A) и моей консоли приложение (мой клиент) находится в другой системе (System B).

Когда мой клиент из System B посылает запрос, он попадет мое обслуживание успешно, но когда служба пытается получить доступ к SQL Server, он показывает ошибку:

Exception In Account Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.

стороны клиента код:

public static void Main(string[] args) 
{ 
    try 
    { 
     ServiceClient obj = new ServiceClient(); 
     obj.ClientCredentials.Windows.AllowedImpersonationLevel = 
       System.Security.Principal.TokenImpersonationLevel.Impersonation; 
     obj.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;    
      AccModel objAccModel = new AccModel(); 
      objAccModel.ACC_No = "jkh90"; 
      objAccModel.Remark = "dsdsadasd"; 
      objAccModel.ACC_Code = "AA"; 
      var strflight = obj.Acc_Validate(objAccModel); 
    } 
    catch (Exception ex) 
    { 
     Console.Write(ex.Message); 
    } 
} 

код на стороне сервера (службы WCF):

public string Acc_Validate(ACCModel objACCModel) 
{ 
    try 
    { 
     using (WindowsImpersonationContext ctx = WindowsIdentity.GetCurrent().Impersonate()) 
     { 
      SqlParameter[] parameter = { 
       new SqlParameter("@CMD","ACCVALIDATE"), 
       new SqlParameter("@ACC_No",objACCModel.ACC_No), 
       new SqlParameter("@ACC_Code",objACCModel.ACC_Code), 
       new SqlParameter("@PNRIDOUT", SqlDbType.NVarChar,800) {Direction = ParameterDirection.Output} 
      }; 

      strStatus = SQLHelper.ExecuteNonQueryTwoOutputResult(SQLHelper.ConnectionStringLocalTransaction, CommandType.StoredProcedure, DBConstants.PRIU_ACC_DETAILS, "@PNRIDOUT", parameter); 
     } 
    } 
    catch (Exception ex) 
    { 
     ClsLogging.writefile("Errorrrrrrrrrrr " + ex.Message, ClsLogging.LogType.BTA_Service_Exception); 
    } 
} 

конфигурации службы WCF (web.config файл):

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
     <compilation debug="true" targetFramework="4.5"/> 
     <pages controlRenderingCompatibilityVersion="4.0"/> 
     <httpCookies httpOnlyCookies="true"/> 
     <authentication mode="Windows"> 
     <identity impersonate="true"/> 
    </system.web> 
    <connectionstrings> 
     <add name="Connection" 
      connectionString="Initial Catalog=ACCDB;Data Source=*****;Integrated Security=True;"/> 
    <system.servicemodel> 
     <services> 
      <service name="Service.Service" 
        behaviorConfiguration="ServiceBehavior"> 
       <endpoint 
        address="" 
        binding="basicHttpBinding" 
        bindingConfiguration="TransportSecurity" 
        contract="Service.IService" /> 
       <endpoint 
        address="mex" binding="mexHttpBinding" 
        contract="IMetadataExchange"/> 
      </service> 
     </services> 
     <bindings> 
      <basichttpbinding> 
       <binding name="TransportSecurity"> 
        <security mode="TransportCredentialOnly"> 
         <transport clientCredentialType="Windows"/> 
        </security> 
       </binding> 
      </basichttpbinding> 
     </bindings> 
     <behaviors > 
      <servicebehaviors> 
       <behavior name="ServiceBehavior"> 
        <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
        <serviceMetadata httpGetEnabled="true"/> 
        <serviceAuthorization impersonateCallerForAllOperations="true" /> 
        <serviceDebug includeExceptionDetailInFaults="true"/> 
        <serviceSecurityAudit auditLogLocation="Application" suppressAuditFailure="false" serviceAuthorizationAuditLevel="SuccessOrFailure" messageAuthenticationAuditLevel="SuccessOrFailure"/> 
        <serviceThrottling maxConcurrentCalls="500" maxConcurrentInstances="100" maxConcurrentSessions="200"/> 

    <serviceHostingEnvironment multipleSiteBindingsEnabled="false"/> 

    <system.webserver> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <httpprotocol> 
     <customheaders> 
     <add name="X-Content-Type-Options" value="nosniff"/> 

    <modules runAllManagedModulesForAllRequests="true"/> 
    <directoryBrowse enabled="true"/> 
+2

Что вы пытаетесь достичь? Вы пытаетесь войти в систему, используя учетные данные Клиента? Если это так, см. Это сообщение SO: http: // stackoverflow.com/questions/5646884/how-to-pass-credentials-for-database-to-wcf-service Мне кажется, что вы пытаетесь передать учетные данные любой учетной записи, на которой работает ваша служба, и она не имеет логин на любой сервер, к которому вы подключаетесь. – Mike

+0

Да, я попробовал вашу ссылку и реализовал то же самое в своих решениях, но снова дал мне такую ​​же ошибку. –

ответ

0

Я думаю, что подключение к службе WCF не имеет никаких проблем, но и собственные системы безопасности SQL Server воспринимает клиент как пользователь за барьер безопасности (например, брандмауэр), потому что клиент действительно снаружи, а не администратором машины.

Почему вы не применяете общую идею о том, что режим аутентификации SQL и асимметричное шифрование Web.Config WCF?

Если вам приходится сталкиваться с ситуациями, с которыми клиенты подключаются к Серверу извне, настоятельно рекомендуется использовать шифрование (безопасность).

У меня есть настольное приложение (WPF) на стороне клиентов и служба WCF на службе Cloud, подключающейся к Cloud SQL Server.

+0

Я не могу использовать аутентификацию Sql (имя пользователя и пароль) для моей базы данных. Требование для проверки подлинности Windows для моей базы данных. –

1
  • WCF service(Windows Authenticated and Impersonation)
  • Sql server(Windows Authentication)
  • Console Application(Client)

Для этого сценария требуется Kerberos constrained delegation. Вы не можете этого сделать, вы должны заручиться помощью администратора домена, чтобы настроить его для вас. Читайте и следуйте How to Implement Kerberos Constrained Delegation with SQL Server.

Обратите внимание, что олицетворение и делегирование передают учетные данные исходного клиента (консольного приложения) в базу данных на задней панели, что означает, что вам необходимо предоставить SQL-доступ фактическим пользователям вашей службы, а не WCF учетной записи службы.

+0

Я не могу пойти на kerberos .. Как мое требование для выше Сценарий .. PLS действительно нужно –

 Смежные вопросы

  • Нет связанных вопросов^_^