У меня есть служба 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");
}
}
}
«Я пытаюсь использовать визуальную студию для вызова ссылки» - можете ли вы уточнить, что именно вы делаете и детали сообщения об ошибке? –
В основном, когда я пытаюсь перейти к сервису в своем браузере, я получаю: Описание: HTTP 404. Ресурс, который вы ищете (или его зависимости), мог быть удален, изменилось его имя или временно недоступно. Просмотрите следующий URL-адрес и убедитесь, что оно написано правильно. Это происходит, когда все, что я изменил в службе, - использовать TransportwithMessageCredential и поведение службы, как описано выше. При использовании только транспортной безопасности он отлично работает. Однако мне нужно закрепить его с помощью имени пользователя/пароля. –
Вы пытаетесь использовать HTTPS: //...*.svc, если видите 404? Это действительно странно. Безопасность не должна перемещать конечную точку. –