전송 보안 모드를 사용하여 실행중인 basichttpbinding WCF 서비스가 있습니다. 이 잘 작동하지만이 서비스를 요청하는 사용자를 인증하고 싶습니다. 따라서 TransportWithMessagCredential의 보안 모드와 UserName의 clientCredentialType 메시지를 사용하고 사용자 지정 암호 유효성 검사기를 호출하는 서비스 동작을 추가하려고했습니다. 내 문제는 Visual Studio를 사용하여 참조를 호출하려고 할 때 서비스를 찾을 수 없다는 오류가 발생합니다. 아래에서 내 코드를 찾아서이 기능을 사용하기 위해 필요한 변경 사항을 제안하고 서비스를 추가 할 때 사용자 이름/암호를 묻습니다.사용자 이름/암호를 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");
}
}
}
"Visual Studio를 사용하여 참조를 호출하려고합니다."- 정확히 무엇을하고 오류 메시지 세부 정보를 명확히 할 수 있습니까? –
기본적으로 브라우저에서 서비스를 탐색하려고하면 설명이 나타납니다. 설명 : HTTP 404. 찾고있는 리소스 (또는 해당 종속성 중 하나)가 제거되었거나 이름이 변경되었거나 일시적으로 사용할 수 없습니다. 다음 URL을 검토하고 철자가 올바른지 확인하십시오. 이것은 서비스에서 변경된 모든 것이 TransportwithMessageCredential과 위에서 설명한 서비스 동작을 사용하는 경우에 발생합니다. 전송 보안 만 사용할 때 제대로 작동합니다. 그러나 사용자 이름/암호로 보안을 설정해야합니다. –
404를 볼 때 HTTPS : //...*.svc를 시도합니까? 정말 이상합니다. 보안은 엔드 포인트를 이동 시켜서는 안됩니다. –