2015-04-10 2 views
0

Я прочитал несколько вопросов здесь, в SO и в каком-то связанном учебнике.WCF basicHttpBinding с именем пользователя и паролем из приложения WPF

Я сделал все, но у меня есть проблема ... аутентификация не работает. Она дает исключение только в том случае, если я отправляю случайное имя пользователя без учета пароля.

Я думаю, может быть, потому что валидатор, которого я написал, никогда не назывался (я его остановил) ... но почему?

Это мой app.confing ФОС:

<appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    <add key="userName" value="piero"/> 
    <add key="password" value="piero"/> 
</appSettings> 
<system.web> 
    <compilation debug="true" /> 
</system.web> 
<!-- Quando si distribuisce il progetto della libreria di servizi, è necessario aggiungere il contenuto del file di configurazione al file 
app.config dell'host. System.Configuration non supporta i file di configurazione delle librerie. --> 
<system.serviceModel> 
    <!--<standardEndpoints/>--> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="usernameHttps"> 
     <security mode="TransportWithMessageCredential"> 
      <message clientCredentialType="UserName"/> 
     </security> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 
    <services> 
    <service name="calc.CalcService" behaviorConfiguration="customBehavior"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="" 
     name="base" contract="calc.ICalcService" > 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" /> 
     <endpoint address="web" behaviorConfiguration="webHttp" binding="webHttpBinding" 
     bindingConfiguration="" name="web" contract="calc.ICalcService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
     <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:8733/Design_Time_Addresses/calc/" /> 
     </baseAddresses> 
     </host> 
    </service> 
    </services> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="webHttp"> 
     <webHttp/> 
     </behavior> 
    </endpointBehaviors> 
      <serviceBehaviors> 
    <behavior > 

     <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/> 


     <serviceDebug includeExceptionDetailInFaults="False" /> 
    </behavior> 
    <behavior name="customBehavior"> 
     <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/> 
     <serviceDebug includeExceptionDetailInFaults="True" /> 
     <serviceCredentials> 
     <userNameAuthentication 
      userNamePasswordValidationMode="Custom" 
      customUserNamePasswordValidatorType="calc.CustomPass, calc"/> 
     </serviceCredentials> 
    </behavior> 

    </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
    <add binding="webHttpBinding" scheme="http" /> 
    </protocolMapping> 
</system.serviceModel> 

и это конфиг звания МОФ приложения:

<?xml version="1.0" encoding="utf-8" ?> 
    <configuration> 
     <startup> 
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
     </startup> 
     <system.serviceModel> 
      <bindings> 
       <basicHttpBinding> 
        <!--<binding name="base" />--> 
       <binding name="base"> 
        <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Basic"/> 
        </security> 
       </binding> 
       </basicHttpBinding> 
      </bindings> 
      <client> 
       <endpoint address="http://localhost:8733/Design_Time_Addresses/calc/" 
        binding="basicHttpBinding" bindingConfiguration="base" contract="calcTest.ICalcService" 
        name="base" /> 
      </client> 
     </system.serviceModel> 
    <appSettings> 
     <add key="userName" value="aaa"/> 
     <add key="password" value="bbb"/> 
    </appSettings> 
    </configuration> 

и это является валидатором wcf:

public class CustomPass : UserNamePasswordValidator //System.IdentityModel.dll 
{ 
    private const string USERNAME_ELEMENT_NAME = "userName"; 

    private const string PASSWORD_ELEMENT_NAME = "password"; 

    private const string FAULT_EXCEPTION_MESSAGE = "UserName or Password is incorrect!"; 

    public override void Validate(string userName, string password) 
    { 
     //Guarder.Guard.ArgumentNotNull(userName).ArgumentNotNull(password); 
     var validateUserName = ConfigurationManager.AppSettings[USERNAME_ELEMENT_NAME]; 
     var validatePassword = ConfigurationManager.AppSettings[PASSWORD_ELEMENT_NAME]; 
     var validateCondition = userName.Equals(validateUserName) && password.Equals(validatePassword); 
     if (!validateCondition) 
     { 
      throw new FaultException(FAULT_EXCEPTION_MESSAGE); 
     } 
    } 
} 

Итак:

  • служба ФОС начинает правильно;
  • приложение WPF называет его (BasicHttpBinding) и использует его, но:

    1. если нет имени пользователя, он получает ошибку от ФОС (это нормально, я думаю)

    2. ФОС служба принимает все имя пользователя, а не только тот, который я поставил в валидатор

    3. пароль бесполезен, я могу послать что-нибудь, но только имя пользователя, кажется

для чтения в некотором роде, но ФОС

Как я могу использовать свой валидатор? Почему это не начинается?

Я называю ФОС таким образом (? Любые ошибки здесь):

private void Add(object sender, RoutedEventArgs e) 
{ 
    var n1 = this.opOne.Text.ToString(); 
    var n2 = this.opTwo.Text.ToString(); 
    var calc = new calcTest.CalcServiceClient(); 
    calc.ClientCredentials.UserName.UserName = "piero"; 
    calc.ClientCredentials.UserName.Password = "piero"; 
    this.res.Text = calc.Add(n1, n2); 
} 
+0

Какое исключение вы получаете? –

+0

Я добавил следующее: behaviorConfiguration = "customBehavior" в конечной точке basicHttpBinding, он говорит, что это недопустимое значение, но это имя моего пользовательского поведения ... –

+0

это даже не исключение .. в визуальном студийный редактор, это подчеркивается blu .. и в сообщении говорится: «Ошибка атрибутаConfiguration недействительна. Значение customBehavior недопустимо для типа данных конечной точкиBehaviorConfigurationType« –

ответ

0

вы можете просто отладить "Service.Open()" - метод?

Там вы увидите, добавлено ли ваше CustomBehavior в Behavios службы. Вы должны вызвать методы поведения и вызвать CustomPasswordValidator.

Итак, вам нужно написать CustomBehavior, который расширяет ServiceBehavior, а затем вызывает один из четырех методов (Valdate, AddBindingParameters и т. Д.). Вам нужно выяснить, где вызывается PasswordValidator.

Я думаю, что это в SecurityBindingElement из BindingElementCollection вашей привязки службы (ничего себе, что предложение). Затем вы должны добавить CustomBehavior (app.config или dirctly в коде). Маби, вам нужно применить привязку к CustomBinding, чтобы иметь возможность изменять элементы SecurityBindingelement.

Я надеюсь, что это поможет вам решить вашу проблему с помощью CustomPasswordValidator.

Смежные вопросы