У меня есть ASP.NET MVC WebApplication, размещенный в server-frontend
, который является клиентом приложения WCF, размещенного в server-wcf
, как в той же сети/домене. Оба сервера - это Windows Server 2012 с IIS 8.Получить имя пользователя вызывающего абонента вместо имени компьютера в WCF
Я включил проверку подлинности Windows и отключил ее в обоих проектах (csproj).
Если я называю this.User.Identity.Name
внутри контроллера в моем WebApp, он правильно дает пользователю авторизованы (например MYDOMAIN \ Alisson).
Оба проекта были настроены с проверкой подлинности Windows в IIS, и WebApp, в частности, имеет олицетворение ASP.NET. Оба имеют формы, основные и анонимные отключены. В обоих пулах используется NetworkService
.
Мой проект WCF отвечает за подключение к SQL Server, и он работает правильно, поскольку я дал разрешение самому компьютеру в моей базе данных (например, server-wcf$
), и это именно то, что я ожидаю.
Теперь я пытаюсь вызвать метод WCF из моего WebApp так:
var binding = new BasicHttpBinding();
binding.MaxReceivedMessageSize = 10485760;
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
var endPoint = new EndpointAddress(address);
var channelFactory = new ChannelFactory<IMyService>(binding, endPoint);
var client = channelFactory.CreateChannel();
client.GetUser();
и это GetUser()
в моей службы WCF объявляется следующим образом:
public GetUser()
{
return ServiceSecurityContext.Current.WindowsIdentity.Name;
}
который возвращает domain\server-frontend
вместо от domain\alisson
.
Я хочу, чтобы он получил пользователя в WCF, но поддерживайте способ подключения WCF к базе данных как к самому себе (server-wcf).
Мои WebApp web.config имеет следующее:
<identity impersonate="true" />
<authentication mode="Windows" />
<authorization>
<deny users="?" />
</authorization>
В то время как WCF имеет следующий внутри web.config ServiceModel:
<bindings>
<basicHttpBinding>
<binding name="AutomatizacaoBinding" maxReceivedMessageSize="10485760">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
Можно ли добиться этого?
Это то же самое, что и 'ServiceSecurityContext.Current.WindowsIdentity.Name'. Я хотел получить то же самое, что вызвать 'this.User.Identity.Name' в caller WebApp Controller, который возвращает' domain \ alisson'. – Alisson
Собственно, это возвращает ** domain \ alisson **, только если я запускаю WebApp локально в VS с помощью IIS Express. Когда я публикую его на своем «сервере-frontend», он получает ** domain \ server-frontend ** в качестве идентификатора. – Alisson
У меня есть аналогичная служба, которая отлично работает с OperationContext, но из-за вашего комментария я заметил, что существует небольшая разница между нашими конфигурационными файлами, мой набор «режим безопасности» как «Транспорт», а не «TransportCredentialOnly», возможно это может сделать некоторую разницу –