2011-01-24 1 views
2

У меня есть служба WCF ... которая будет находиться на Azure. Я добавил проверки подлинности форм и авторизации с помощью следующей конфигурации в файле web.config:Звонки на службу Wcf запрещены? Это проблема с веб-конфигурацией?

<system.web> 
     <compilation debug="true" targetFramework="4.0" /> 
     <authentication mode="Forms"> 
      <forms loginUrl="blah.svc" timeout="2880" /> 
     </authentication> 
     <membership defaultProvider="SqlMembershipProvider"> 
      <providers> 
       <add connectionStringName="blah" applicationName="blah_app" name="SqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" /> 
      </providers> 
     </membership> 
     <profile> 
      <providers> 
       <add name="SqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="blah" applicationName="blah_app" /> 
      </providers> 
     </profile> 
     <roleManager enabled="true" defaultProvider="SqlRoleProvider"> 
      <providers> 
       <add connectionStringName="blah" applicationName="blah_app" name="SqlRoleProvider" type="System.Web.Security.SqlRoleProvider" /> 
      </providers> 
     </roleManager> 
    </system.web> 
    <system.serviceModel> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="wsHttp"> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="false" /> 
        <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider" /> 
        <serviceCredentials> 
         <serviceCertificate x509FindType="FindBySubjectName" storeName="My" storeLocation="LocalMachine" findValue="blah_cert" /> 
        </serviceCredentials> 

       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
     <services> 
      <service name="blah_app.blah" behaviorConfiguration="wsHttp"> 
       <endpoint address="" contract="blah_app.iblah" binding="wsHttpBinding" /> 
      </service> 
     </services> 
    </system.serviceModel> 

Проблема я получаю то, что любой из обращений к веб-сервиса от клиента пришедшего в Denied!

public class Blah:IBlah 
{ 
[PrincipalPermission(SecurityAction.Demand, Role = "BlahOppRole")] 
     public BlahResponse Blah(BlahRequest BlahRequest) 
     { 
      BlahResponse = new BlahResponse(); 


      return response; 
     } 
} 

Мой клиент - приложение для консолей Windows. Он имеет следующую конфигурацию:

<system.serviceModel> 
     <bindings> 
      <wsHttpBinding> 
       <binding name="WSHttpBinding_IBlah" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
        allowCookies="false"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="Message"> 
         <transport clientCredentialType="Digest" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="UserName" negotiateServiceCredential="true" 
          algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://127.0.0.1:89/Blah.svc" 
       binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IBlah" 
       contract="Data.Blah" name="WSHttpBinding_IBlah"> 
       <identity> 
        <dns value="blah_cert"/> 
       </identity> 
      </endpoint> 
     </client> 
+0

Я проверил, чтобы убедиться, что текущий пользователь имеет «BlahOppRole» и имеет достаточное имя пользователя и пароль через этот WAT (Инструмент администрирования веб-сайтов). Однако неважно, что я делаю, я получаю ответ на отказ от доступа! Любая помощь будет оценена! – bleepzter

+0

Вы можете получить доступ к .svc с IE? –

+0

Когда я запускаю его изнутри, я могу получить к нему доступ. Я вижу экран, где говорится: «Вы создали службу. Для проверки этого вам нужно будет создать клиента ... и т. Д.». Так да. Я всегда обновляю ссылку на услугу у своего клиента, и все в порядке.Однако пользователь не получает разрешение на вызов конкретного метода на основе настроенных ролей, поэтому у меня проблема – bleepzter

ответ

1

This MSDN article дает хороший шаг за шагом инструкции о том, как настроить WsHttpBinding с аутентификацией UserName.

В основном вы должны

  • Установить режим безопасности для TransportWithMessageCredential (Шаг 6)
  • Добавить поведение в ServiceCredentials обслуживания и настройки userNameAuthentication (Шаг 8)
  • Измените приложение клиента, чтобы установить UserName и пароль (шаг 12)
+0

Все сказанное и сделанное, мне нужно было сделать что-то совсем другое. При использовании сертификата X509 (Self Signed Certificate for SSL) у клиента возникает проблема с подтверждением сертификата. В этом случае вам нужно создать поведение конечной точки клиента и указать собственный проверщик сертификата X509, чтобы обмануть клиента, что сертификат действителен. – bleepzter

1

Ну, Поскольку я использовал самоподписанный сертификат ... клиент подбрасывал подлинность этого сертификата. Общими ошибками были AccessDenied (из-за неправильной настройки службы), а также «Ошибка при обсуждении служебных учетных данных ...» или что-то в этом роде. Короче говоря, после прочтения статьи этого замечательного коллеги (Спасибо Dev @ Work) Dev @ Work Мне удалось изменить его работу и добавить аутентификацию и авторизацию форм ASP.NET через службы членства и роли в службе.

Чтобы подвести итог, у Dev @ Work была очень важная точка. Клиенты WCF будут кричать о самоподписанных сертификатах. Трюк для создания полезной службы wcf на dev-сервере заключается в том, чтобы лгать клиентам службы аутентичности сертификата, используемого для кодирования учетных данных клиента. Для этого любой клиент wcf должен иметь поведение Configuration до его serviceEndpoint и использовать механизм проверки сертификатов для проверки подлинности сертификата сервера. Это делается путем создания объекта, который наследует от System.IdentityModel.Selectors.X509CertificateValidator и путем переопределения метода Validate() указанного объекта. Проверка успешна, если указанный объект не бросает ошибки:

<client> 
      <endpoint address="http://machine:5101/blah.svc" 
       binding="wsHttpBinding" bindingConfiguration="WsHttpBinding_Iblah" 
       contract="Data.Iblah" name="WsHttpBinding_Iblah" behaviorConfiguration="BehaviorConfig"> 
       <identity> 
        <certificate encodedValue="..." /> 
       </identity> 
      </endpoint> 
     </client> 

     <behaviors> 
      <endpointBehaviors> 
       <behavior name="BehaviorConfig"> 
        <clientCredentials> 
         <serviceCertificate> 
          <authentication certificateValidationMode="Custom" customCertificateValidatorType="BlahConsole.X509Validator, BlahConsole"/> 
         </serviceCertificate> 
        </clientCredentials>   
       </behavior> 
      </endpointBehaviors> 
     </behaviors> 

И пользовательские валидатор:

internal class X509Validator : System.IdentityModel.Selectors.X509CertificateValidator 
    { 
     public override void Validate(X509Certificate2 certificate) 
     { 
      // validate argument 
      if (certificate == null) 
       throw new ArgumentNullException("Certificate is null"); 
     } 
    }