Хост Visual Studio, схемы аутентификации, настроенные на хосте («Аноним») - PullRequest
0 голосов
/ 06 апреля 2020

я столкнулся и ошибка

Схемы аутентификации, настроенные на хосте («Анонимный»), не позволяют использовать схемы, настроенные для привязки «WebHttpBinding» («Basi c»).

Проблема возникает, когда я запускаю Службу в VS.

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.6" />
    <httpRuntime targetFramework="4.6"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding>
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceX_Behavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="ServiceX.CustomUserNamePasswordValidator, ServiceX"/>
          </serviceCredentials>
          <!--<serviceAuthenticationManager authenticationSchemes="Basic"/>-->
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webHttpBinding_Behavior">
          <webHttp helpEnabled="true"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <!--<protocolMapping>
      <add binding="basicHttpBinding" scheme="http" />
    </protocolMapping>-->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service name="ServiceX.ServiceX" behaviorConfiguration="ServiceX_Behavior">
        <endpoint address="" binding="webHttpBinding" contract="ServiceX.IServiceX" behaviorConfiguration="webHttpBinding_Behavior" />
        <endpoint address="soap" binding="basicHttpBinding" contract="ServiceX.IServiceX" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

Когда я работаю в IIS, все работает нормально. Когда я запускаю консольное приложение, оно работает весело. В чем разница с VS? Следующее работает нормально, так же, как описанный выше config

Uri serviceUri = new Uri("http://localhost/TestService");
ServiceHost serviceHost = new ServiceHost(typeof(TestService), serviceUri);


BasicHttpBinding basicHttp = new BasicHttpBinding();
serviceHost.AddServiceEndpoint(typeof(IService), basicHttp, "soap");

ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
serviceHost.Description.Behaviors.Add(behavior);
serviceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");


var contract = ContractDescription.GetContract(typeof(IService));
contract.Namespace = "WCFServer";

var webHttpEndpoint = new WebHttpEndpoint(contract);
webHttpEndpoint.Address = new EndpointAddress(serviceUri);
var webHttpBinding = (WebHttpBinding)webHttpEndpoint.Binding;
webHttpBinding.Security.Mode = WebHttpSecurityMode.TransportCredentialOnly;
webHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
serviceHost.AddServiceEndpoint(webHttpEndpoint);

//serviceHost.Authentication.AuthenticationSchemes = AuthenticationSchemes.Basic;
serviceHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new CustomUserNameAuthentication();

foreach (var bh in serviceHost.Description.Behaviors)
{
    var serviceMetadata = bh as ServiceMetadataBehavior;
    if (serviceMetadata != null)
    {
        serviceMetadata.HttpGetEnabled = true;
    }

    var serviceDebug = bh as ServiceDebugBehavior;
    if (serviceDebug != null)
    {
        serviceDebug.IncludeExceptionDetailInFaults = false;
    }
}
serviceHost.Open();
Console.ReadLine();
serviceHost.Close();

В ISS Basi c Аутентификация и анонимная аутентификация разрешены
IN VS Анонимная аутентификация включена

Как происходит в Visual Studio веб-проект WCF не работает, консольный проект и развернутый в IIS веб-приложение работают нормально. В чем разница?

Я хочу реализовать аутентификацию Basi c в WCF

1 Ответ

1 голос
/ 13 апреля 2020

Причина root в том, что IIS Express по умолчанию не включил BasicAuthentication. Как вы знаете, нам нужно включить BasicAuthentication для поддержки WCF BasicAuthentication. IIS Express настроен с файлом ApplicationHost.config. Мы должны обновить следующие значения в ApplicationHost.config, чтобы включить BasicAuthentication.

<security>
            <access sslFlags="None" />
            <applicationDependencies>
                <application name="Active Server Pages" groupId="ASP" />
            </applicationDependencies>
            <authentication>
                <anonymousAuthentication enabled="true" userName="" />
<!-- set to true –->
                <basicAuthentication enabled="true" />

В VS2015 и выше. ApplicationHost.config находится ниже.

Каталог файлов решений (содержащий файл Sln) /. Vs / имя решения / applicationhost.config

Не стесняйтесь я знаю, если проблема все еще существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...