Добрый день. Есть сервис. Необходимо, чтобы методами его контракта пользовались только определенные роли. Без использования сертификатов. Только по логину и паролю На мсдне нашел подобный пример с сертификатами и 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>
|
Он впринципе стандартный разрешенный, но только куки разрешены. Отлаживаю все стандартным хттп сервером студии. Поэтому хост у сервиса - студия.. Подскажите пожалуйста в чем может быть дело
|