WCF - метод ValidateUserNamePasswordCore() в пользовательском UserNameSecurityTokenAuthenticator не вызывается
Я определил собственный поставщик ServiceCredentials:
class PasswordServiceCredentials : ServiceCredentials
{
}
Этот провайдер генерирует собственный SecurityTokenManager в методе CreateSecurityTokenManager(), когда я запускаю свой ServiceHost:
public override SecurityTokenManager CreateSecurityTokenManager()
{
if (this.UserNameAuthentication.UserNamePasswordValidationMode == UserNamePasswordValidationMode.Custom)
{
return new PasswordSecurityTokenManager(this);
}
return base.CreateSecurityTokenManager();
}
Класс PasswordSecurityTokenManager:
class PasswordSecurityTokenManager : ServiceCredentialsSecurityTokenManager
{
}
Экземпляр создает собственный метод SecurityTokenAuthenticator в методе CreateSecurityTokenAuthenticator():
public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
{
outOfBandTokenResolver = null;
return new PasswordSecurityTokenAuthenticator(this.ServiceCredentials
.UserNameAuthentication
.CustomUserNamePasswordValidator);
}
Сгенерированный экземпляр - это пользовательский CustomUserNameSecurityTokenAuthenticator.
Проблема в том, что перезаписанный метод ValidateUserNamePasswordCore() НЕ ВЫЗЫВАЕТСЯ в любое время:
protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateUserNamePasswordCore(String userName, String password)
{
ReadOnlyCollection<IAuthorizationPolicy> currentPolicies = base.ValidateUserNamePasswordCore(userName, password);
List<IAuthorizationPolicy> newPolicies = new List<IAuthorizationPolicy>();
if (currentPolicies != null)
{
newPolicies.AddRange(currentPolicies.OfType<IAuthorizationPolicy>());
}
newPolicies.Add(new PasswordAuthorizationPolicy(userName, password));
return newPolicies.AsReadOnly();
}
В моем пользовательском провайдере IAuthorizationPolicy PasswordAuthorizationPolicy я хочу установить собственный ценовой тариф для метода EvaluationContext в методе Evaluate().
Но если верхний метод не вызывается, никакой дополнительный элемент IAuthorizationPolicy не может быть определен.
Что не так или не здесь?
Я НЕ использую XML для настройки своего сервиса, я делаю это на 100% в коде C#!
РЕДАКТИРОВАТЬ: код основан на следующей статье в блоге: http://www.neovolve.com/post/2008/04/07/wcf-security-getting-the-password-of-the-user.aspx
1 ответ
Хорошо, я спрашиваю только потому, что вы никогда ничего не упоминали о своем файле конфигурации в своем посте, но вы устанавливаете тип serviceCredentials в вашем serviceBehaviors? Пример:
<behaviors>
<serviceBehaviors>
<behavior name="YourCustomBehavior">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials type="Your.Namespace.PasswordServiceCredentials, Your.Namespace">
<serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" />
<userNameAuthentication userNamePasswordValidationMode="Custom" />
</serviceCredentials>
<serviceAuthorization principalPermissionMode="Custom" />
</behavior>
</serviceBehaviors>
</behaviors>
И если да, то ссылаетесь ли вы на "YourCustomBehavior" в своей конфигурации поведения на узле обслуживания? Пример:
<services>
<service behaviorConfiguration="YourCustomBehavior"
name="Your.Service.Namespace.YourService">
<endpoint address="net.tcp://..."
binding="netTcpBinding" bindingConfiguration="netTcpBindingConfig"
contract="Your.Service.Interface.Namespace.IYourService" />
</service>
</services>
Это может быть так же очевидно, как это.