Я называю свою службу следующим образом:
private void button1_Click(object sender, RoutedEventArgs e)
{
TestServiceClient client = new
TestServiceClient("WSHttpBinding_ITestService");
client.ClientCredentials.UserName.UserName = "wrong";
client.ClientCredentials.UserName.Password = "password";
try
{
client.Open();
client.GetColors(); //should not validate, but it is.
client.Close();
}
catch (Exception ex)
{
}
}
Я переопределяю Подтвердить так:
public class CustomUserNameValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if ((userName != "right") || (password != "password"))
{
throw new SecurityTokenException("Validation Failed!");
}
}
public CustomUserNameValidator()
{
}
}
CustomUserNameValidator находится в моем Test.dll, поэтому в моем файле web.configsРаздел ServiceBehehaviors, я определил это:
<behavior name="CustomValidator">
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="Test.CustomUserNameValidator, Test"/>
<serviceCertificate findValue="Test" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
</serviceCredentials>
<serviceMetadata httpGetEnabled="True"/>
</behavior>
Когда я запускаю клиент, он прекрасно выполняет службу, даже если я указал неверные учетные данные.Подтвердить даже не позвонили.Единственный способ заставить Validate быть вызванным, это если я добавлю его в свою операцию GetColors, но тогда мне придется помещать его в каждую операцию.
Мои пользователи хранятся в таблице с именем пользователя изашифрованный пароль, так что стоит ли использовать специальный валидатор имени пользователя / пароля или я должен подходить к нему по-другому?
Работает ли валидация произвольного имени пользователя, если оно не размещено самостоятельно, а размещено в IIS?