Невозможно получить доступ к SQL server из службы WCF (Windows authenticated) из клиента (консольного приложения) на языке C#
Здесь я использую
1) служба WCF (аутентификация Windows и олицетворение)
2) Sql server (аутентификация Windows)
3) Консольное Приложение (Клиент)
Все они находятся в одном домене
Я потребляю аутентифицированную службу WCF windows из консольного приложения (клиента), поэтому, когда я пытаюсь получить доступ к SQL server из консольного приложения с помощью службы WCF, она показывает мне ошибку :
Exception In Account Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
Мой сценарий таков
моя служба WCF и SQL server находятся в одной системе (предположим, Система A), а мое консольное приложение(Мой клиент) - в другой системе (предположим, система B).
когда мой клиент (система B) отправляет запрос, он успешно попадает в мою службу, но когда служба пытается получить доступ к SQL server, она показывает ошибку:
Exception In Account Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
Что я уже пробовал:
Мой клиентский код:
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 (файл веб-конфигурации)
<?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"/> <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"/> <bindings> <basichttpbinding> <binding name="TransportSecurity"> <security mode="TransportCredentialOnly"> <transport clientCredentialType="Windows"/> <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"/>