Можно ли отключить аутентификацию WCF для одной операции

Недавно я прочитал Руководство по безопасности WCF и использую его для создания приложения, в котором пользователям необходимо создать свою собственную учетную запись, а затем получить доступ к приложению с защитой сообщений. Ниже приведен файл web.config, который я придумал далеко от книги. Проблема, с которой я сталкиваюсь, связана с регистрацией пользователей. Поскольку приложению требуется аутентификация по имени пользователя и паролю, метод регистрации нового пользователя постоянно терпит неудачу.

Я знаю один способ обойти это (переключение на аутентификацию на основе ролей и создание одного пользователя в роли с правами на регистрацию и просто жесткое кодирование этой информации в методе регистрации), но я ищу альтернативное решение. Есть ли способ объявить на уровне операции, что конкретный метод не требует аутентификации? Если нет, есть ли способ предоставить отдельную конечную точку с другим сервисным контрактом и сделать так, чтобы этот контракт не требовал проверки подлинности? Большая часть файла web.config связана с провайдером членства и безопасностью сообщений, что меня немного беспокоит, но для того, чтобы метод правильно зарегистрировал нового члена в базе данных, он, очевидно, должен знать о провайдере членства...

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

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <connectionStrings>
    <add name="MyLocalSQLServer"
         connectionString="Initial Catalog=aspnetdb;data source=DESKTOP;Integrated Security=SSPI;"/>
  </connectionStrings>
  <system.web>
    <authentication mode="Forms" />
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
    <membership defaultProvider="MySqlMembershipProvider">
      <providers>
        <clear />
        <add name="mySqlMembershipProvider"
             connectionStringName="MyLocalSQLServer"
             applicationName="Mech"
             type="System.Web.Security.SqlMembershipProvider" />
      </providers>
    </membership>                
  </system.web>
  <system.serviceModel>
    <bindings>
      <wsDualHttpBinding>
        <binding name="wsDualHttpEndpointBinding">
          <security>
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsDualHttpBinding>
    </bindings>
    <services>
      <service name="MechService.MechService">
        <endpoint address="localhost/MechService" binding="wsDualHttpBinding" bindingConfiguration="wsDualHttpEndpointBinding"
          name="wsDualHttpEndpoint" contract="MechService.IMechService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
          <serviceCredentials>
            <serviceCertificate findValue="CN=TempCert" />
            <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
              membershipProviderName="MySqlMembershipProvider" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

Это функция для регистрации новых пользователей.

    public string CreateUser(String Name, String Password, String Email, String Question, String Answer)
    {
        MembershipCreateStatus status;

        try
        {
            MembershipUser newUser = Membership.CreateUser(Name, Password, Email, Question, Answer, true, out status);

            if (newUser == null)
            {
                return GetErrorMessage(status);
            }
            else
            {
                return "MECH_CODE_SUCCESS";
            }
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }

person Mike Beck    schedule 03.09.2013    source источник


Ответы (1)


Вы не можете отказаться от аутентификации в рамках одной операции (хотя вы можете отказаться от авторизации, но это будет вам полезно). Хорошей новостью является то, что настройки аутентификации относятся к каждой конечной точке, а конечная точка имеет один контракт. Поэтому переместите операцию registerUser в новый ServiceContract и создайте для нее отдельную привязку без проверки подлинности.

person Yaron Naveh    schedule 03.09.2013