2012-06-12 1 views
1

У меня есть служба WCF basichttpbinding, работающая в режиме безопасности. Это работает отлично, однако я хотел бы аутентифицировать пользователя, который запрашивает эту службу, поэтому попытался использовать режим безопасности TransportWithMessagCredential и message clientCredentialType для UserName и добавил поведение службы для вызова настраиваемого пароля. Моя проблема в том, что когда я пытаюсь использовать визуальную студию для вызова ссылки, я получаю сообщение о том, что сервис не найден. Пожалуйста, найдите мой код ниже и предложите любые изменения, которые мне могут потребоваться, чтобы заставить это работать, и предложите мне ввести имя пользователя/пароль при попытке добавить службу.пользовательское имя пользователя/пароль в ssl webservice

Web.config

<?xml version="1.0"?> 
<configuration> 
<system.diagnostics> 
<sources> 
    <source name="System.ServiceModel" switchValue="Information, ActivityTracing" 
    propagateActivity="true"> 
    <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
     <filter type="" /> 
     </add> 
     <add initializeData="WcfTraces.svclog" type="System.Diagnostics.XmlWriterTraceListener" 
     name="traceListener"> 
     <filter type="" /> 
     </add> 
    </listeners> 
    </source> 
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing"> 
    <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
     <filter type="" /> 
     </add> 
     <add name="ServiceModelMessageLoggingListener"> 
     <filter type="" /> 
     </add> 
    </listeners> 
    </source> 
</sources> 
<sharedListeners> 
    <add initializeData="c:\users\**\web_messages.svclog" 
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral,  PublicKeyToken=***" 
    name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp"> 
    <filter type="" /> 
    </add> 
</sharedListeners> 
</system.diagnostics> 
<system.serviceModel> 
<diagnostics> 
    <messageLogging logEntireMessage="true" logMalformedMessages="true" 
    logMessagesAtServiceLevel="false" logMessagesAtTransportLevel="true" /> 
</diagnostics> 
<bindings> 
    <basicHttpBinding> 
    <binding name="basicBindingConfig"> 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="None" /> 
     <message clientCredentialType="UserName" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<services> 
    <service behaviorConfiguration="ServiceBehavior" name="nameSpaceX.Service"> 
    <endpoint address="https://************:443/***.svc/" 
     binding="basicHttpBinding" bindingConfiguration="basicBindingConfig" 
     contract="nameSpaceY.IService"> 
     <identity> 
     <certificateReference x509FindType="FindByThumbprint" findValue="****************" /> 
     </identity> 
    </endpoint> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
     <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" 
     httpsGetUrl="https://*****:443/***.svc" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     <serviceCredentials> 
     <userNameAuthentication userNamePasswordValidationMode="Custom" 
      customUserNamePasswordValidatorType="namespaceX.UserNameValidator, namespaceX" /> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
</system.serviceModel> 

</configuration> 

userNameValidator.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IdentityModel.Selectors; 
using System.IdentityModel.Tokens; 

namespace namespaceX 
{ 
class UserNameValidator: UserNamePasswordValidator 
{ 
    public override void Validate(string username, string password) 
    { 
     if(username == "test" && password == "1234") 
      return; 
     throw new SecurityTokenException("Incorrect username or Password"); 
    } 
} 
} 
+1

«Я пытаюсь использовать визуальную студию для вызова ссылки» - можете ли вы уточнить, что именно вы делаете и детали сообщения об ошибке? –

+0

В основном, когда я пытаюсь перейти к сервису в своем браузере, я получаю: Описание: HTTP 404. Ресурс, который вы ищете (или его зависимости), мог быть удален, изменилось его имя или временно недоступно. Просмотрите следующий URL-адрес и убедитесь, что оно написано правильно. Это происходит, когда все, что я изменил в службе, - использовать TransportwithMessageCredential и поведение службы, как описано выше. При использовании только транспортной безопасности он отлично работает. Однако мне нужно закрепить его с помощью имени пользователя/пароля. –

+0

Вы пытаетесь использовать HTTPS: //...*.svc, если видите 404? Это действительно странно. Безопасность не должна перемещать конечную точку. –

ответ

0

Вам не нужно путь к * .svc здесь. Обычно httpsGetUrl атрибут пропущен или хранит ...? WSDL

<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" 
    httpsGetUrl="https://*****:443/***.svc" /> 

Это было сказано с предположением, что URL здесь такая же, как один в конечных точек службы. Ti должны быть разными URL-адресами, потому что один является реализацией, а второй - метаданными.

+0

это необходимо, иначе WCF указывает на имя машины вместо имени домена при создании службы –

+0

Я обновил свой ответ. –

+0

dsicovered моя ошибка. Когда я просмотрел https: // *****: 443/***. Svc, я добавлю дополнительную косую черту в конце, как следует https: // *****: 443/***. Svc/и он сломал его. Действительно глупо. Спасибо за вашу помощь в любом случае –