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> 

Это может быть так же очевидно, как это.


http://www.avivacommunityfund.org/ideas/acf13499

Другие вопросы по тегам