Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > WCF Аутентификация Роли по http


Автор: hug 9.12.2009, 10:26
Добрый день. 
Есть сервис. Необходимо, чтобы методами его контракта пользовались только определенные роли.
Без использования сертификатов. Только по логину и паролю
На мсдне нашел подобный пример с сертификатами и ws биндингом.
Переделал его под свои нужды и ... не работает.
Итак сервис
Код

public class Service1 : IService1
{
        [PrincipalPermission(SecurityAction.Demand, Role="Managers")]
        public bool LoadPrice(string xmlDoc)
        {
           return true;
        }
}

Делаем конфиг:
Код


<services>
      <service name="Pharm.PriceLoader.Service1" behaviorConfiguration="Pharm.PriceLoader.Service1Behavior">
        <endpoint address=""
                  binding="basicHttpBinding"
                  bindingConfiguration="myBinding"
                  contract="Pharm.PriceLoader.IService1"
                  bindingNamespace="http://pharm.com">
          <identity>
            <dns value="localhost"/>
          </identity>          
        </endpoint>
       </service>
</services>

<bindings>
      <basicHttpBinding>
        <binding name="myBinding" allowCookies="true">
          <security mode ="TransportCredentialOnly">
            <message clientCredentialType ="UserName"/>
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>      
 </bindings>

<behaviors>
      <serviceBehaviors>
        <behavior name="Pharm.PriceLoader.Service1Behavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceAuthorization principalPermissionMode="UseAspNetRoles"
                                roleProviderName="MySQLRoleProvider"  />          
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
             membershipProviderName="MySQLMembershipProvider" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>



Все это хочет сделать на простом хттп без сертификатов. Защиту пришлось сделать ну транспортном уровне.
Прописал провайдеры мембершипа и ролей. Они рабочие. Проверены в асп.нет приложении 

Пишем клиента
Код

Service1Client client = new Service1Client();
client.ClientCredentials.UserName.UserName = "1";
client.ClientCredentials.UserName.Password = "1";
bool a = client.LoadPrice("test");

Выходит  Request for principal permission failed. Если открываю контракт и смотрю
 Thread.CurrentPrincipal.Identity.Name то тоже почему-то налл.

App.config клиента
Код

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="true" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:3837/Service1.svc" binding="basicHttpBinding"
          bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
          name="BasicHttpBinding_IService1" />
    </client>
  </system.serviceModel>

Он впринципе стандартный разрешенный, но только куки разрешены.
Отлаживаю все стандартным хттп сервером студии. Поэтому хост у сервиса - студия..
Подскажите пожалуйста в чем может быть дело

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)