WCF: передача имени пользователя и пароля в другой сервис (без Https)
Мне нужно создать службу WCF (ServiceWrapper), которая ссылается на другую службу WCF (RealService).
Я хочу, чтобы клиенты ServiceWrapper передавали имя пользователя / пароль в запросе аутентификации.
Операции ServiceWrapper вызывают RealService. Мне нужно передать полученное имя пользователя / пароль в Authenticate с RealSerivce, а затем вызвать его операции.
Мне нужно разместить службу на Http, а не Https(SSL/TLS).
Вопрос: Как использовать учетные данные клиента, полученные службой, для проверки подлинности с помощью ссылочной службы без использования Https(SSL/TLS)?
2 ответа
Вы можете использовать безопасность SOAP. Для вас есть два режима безопасности - Message, TransportWithMessageCredential.
Вы должны настроить режим безопасности (UserName) в
<binding>
раздел, как это<security mode="TransportWithMessageCredential"> <transport clientCredentialType="" /> <message clientCredentialType="UserName" /> </security>
Далее вы должны указать свой валидатор в
<behavior>
раздел<behavior name="CommonBehavior"> <serviceMetadata /> <serviceDebug includeExceptionDetailInFaults="True"/> <serviceCredentials> <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Megatec.MasterTourService.CustomUserNameValidator, Megatec.MasterTourService"/> <serviceCertificate findValue="WCFServer" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/> <clientCertificate> <authentication certificateValidationMode="PeerTrust" /> </clientCertificate> </serviceCredentials> </behavior>
В вашем пользовательском валидаторе вы можете получить доступ и сохранить имя пользователя и пароль, которые были предоставлены в качестве кредитов для ServiceWrapper.
using System.ServiceModel; using System.IdentityModel.Selectors; namespace MyService { public class CustomUserNameValidator : UserNamePasswordValidator { public override void Validate(string userName, string password) { if (!(userName == "testMan" && password == "pass")) throw new FaultException("Incorrect login or password"); // save your Usermame and Password for future usage. } } }
Когда вам нужно получить доступ к RealService, вы можете использовать userName и пароль в качестве учетных данных, как в моем примере ниже:
private readonly Dictionary<Type, Object> channelFactoryDictionary = new Dictionary<Type, Object>(); private ChannelFactory<T> GetChannelFactory<T>() where T : class { if (channelFactoryDictionary.Keys.Contains(typeof(T))) return channelFactoryDictionary[typeof(T)] as ChannelFactory<T>; var channelFactory = new ChannelFactory<T>("*"); channelFactory.Credentials.UserName.UserName = userName; channelFactory.Credentials.UserName.Password = password; channelFactoryDictionary.Add(typeof(T), channelFactory); return channelFactory; }
Если SSL не вариант, вам нужно будет использовать безопасность сообщений SOAP (SecurityMode = Message).