Вскоре я попытаюсь описать метод, который я использую в своей собственной службе WCF для аутентификации.Существует встроенная обработка аутентификации с конечными точками WCF SOAP с использованием спецификации WS-Security (т. Е. wsHttpBinding
, как вы используете).Вы можете реализовать настройки в файле web.config следующим образом:
<bindings>
<wsHttpBinding>
<binding name="myBindingName">
<security mode="Message">
<transport clientCredentialType="None" />
<message clientCredentialType="UserName" />
</security>
Затем вы можете указать пользовательский тип для обработки логики аутентификации:
<behaviors>
<serviceBehaviors>
<behavior name="myBehaviorName">
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="NameSpaceName.Class,AssemblyName" />
</serviceCredentials>
Этот класс, который обрабатывает логику аутентификации, должен расширятьсяUserNamePasswordValidator
(для этого нужно сослаться на System.IdentityModel.dll
и импортировать System.IdentityModel.Selectors
) и переопределить Validate
:
public class MyValidator : UserNamePasswordValidator {
public override void Validate(string userName, string password) {
// check password. if success, do nothing
// if fail, throw a FaultException
}
}
Для вызова этого кода с использованием клиента ASP.Net WCF необходимо использовать ClientCredential
передать имя пользователя и пароль следующим образом:
// This pattern needs to be repeated and username / password set with every creation
// of a client object. This can be refactored to a separate method to simplify.
MyAPIClient client = new MyAPIClient();
// yes UserName is there twice on purpose, that's the proper structure
client.ClientCredentials.UserName.UserName = theUsername;
client.ClientCredentials.UserName.Password = thePassword;
try {
client.Open();
client.DoSomething();
client.Close();
} catch (Exception ex) {
// handle exception, which should contain a FaultException;
// could be failed login, or problem in DoSomething
}
Очевидно, что привязка и поведение, определенные выше, должны быть назначены самой службе с использованием свойств behaviorConfiguration
и bindingConfiguration
.