- службы WCF (Windows проверку подлинности и олицетворения) (проверка подлинности Windows)
- SQL Server
- 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"/>
Что вы пытаетесь достичь? Вы пытаетесь войти в систему, используя учетные данные Клиента? Если это так, см. Это сообщение SO: http: // stackoverflow.com/questions/5646884/how-to-pass-credentials-for-database-to-wcf-service Мне кажется, что вы пытаетесь передать учетные данные любой учетной записи, на которой работает ваша служба, и она не имеет логин на любой сервер, к которому вы подключаетесь. – Mike
Да, я попробовал вашу ссылку и реализовал то же самое в своих решениях, но снова дал мне такую же ошибку. –