2010-10-27 2 views
1

У меня есть хранилище SqlMembershipProvider с включенными ролями. Это настроено и имеет «devtest» пользователя в ролях «xxUser» и «xxAdmin».Аутентификация поставщика членства ASP.NET, не работающая при аутентификации службы WCF

У меня также есть служба WCF, с которой я хочу пройти аутентификацию и авторизацию.Моя проблема заключается в том, что:

  1. разрешение не происходит, код просто выполняет несмотря на атрибут политики
  2. Я не получаю идентичности или безопасности контекст, так что не знаю, кто вызова службы

мне нужно:

  1. , чтобы узнать, какой пользователь называет метод
  2. некоторая степень отклонения пользователей, если разрешения не совпадают (в идеале это должно быть выполнено в пределах RoleProvider/MembershipProvider/WCF , но может сделать это сам, если мне придется)
  3. SSL в транспорт

Я мой контракт на обслуживание созданы таким образом:

[ServiceContract] 
    public interface ISupportService 
    { 
     [OperationContract] 
     [PrincipalPermission(SecurityAction.Demand, Role = "ThisRoleDoesNotExist")] 
     List<BaseInterestRate> GetAllBaseInterestRates(); 
    } 

код прост е nough:

public class SupportService : ISupportService 
{ 
    public List<BaseInterestRate> GetAllBaseInterestRates() 
    { 
     OperationContext operationContext = OperationContext.Current; 
     ServiceSecurityContext serviceSecurityContext = ServiceSecurityContext.Current; // is always null 

     using (xxxEntities entities = new xxxEntities()) 
     { 
      return new List<BaseInterestRate>(entities.BaseInterestRates); 
     } 
    }} 

Моя конфигурация службы таким образом:

->

<behaviors> 
    <serviceBehaviors> 
     <behavior name="SupportServiceBehavior"> 
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider" /> 
      <serviceCredentials> 
       <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" 
membershipProviderName="SqlMembershipProvider" /> 
      </serviceCredentials> 
     </behavior> 
    <behavior>  
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 

Уже настроил MembershipProvider:

<membership defaultProvider="SqlMembershipProvider" > 
     <providers> 
      <clear/> 
      <add name="SqlMembershipProvider" 
    connectionStringName="SqlMembershipProvider" 
    applicationName="xxx" 
    type="System.Web.Security.SqlMembershipProvider" /> 
     </providers> 
    </membership> 
    <roleManager enabled="true"> 
     <providers> 
      <clear /> 
      <add connectionStringName="SqlMembershipProvider" applicationName="xxx" 
      name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" /> 
      <add applicationName="xxx" name="AspNetWindowsTokenRoleProvider" 
      type="System.Web.Security.WindowsTokenRoleProvider" /> 
     </providers> 
    </roleManager> 

Я следовал инструкциям на этих страницах письма:

Я бы на чтобы ожидать проблемы с сертификатами/транспорта/и др. сбой с исключениями, но я могу отлаживать право в вызове WCF. У меня нет контекста контекста/контекста пользователя, доступного мне, и когда я использую пользователя не в двух упомянутых ролях (что я делаю в приведенном выше примере кода), я не получаю «выкинутый».

Мое клиентское приложение в настоящее время является веб-приложением, но в конечном итоге также будет служить приложением Windows Forms и набором тестов. В настоящее время я использую сервер ASP.NET WebDev и запускаю .NET 4.0.

Я что-то упустил?

+0

Что такое атрибуты по реализации ISupportService? – Aliostad

+0

В классе реализации нет атрибутов. Я обновил сообщение, чтобы его отразить. –

ответ

0

Я немного новичок в службах WCF Rest, но во время моего собственного тестирования я столкнулся с подобной проблемой. Я наткнулся на это видео, которое помогло немного (даже если это было не совсем то, что я пытался сделать):

http://channel9.msdn.com/blogs/rojacobs/endpointtv-securing-restful-services-with-aspnet-membership

По существу проблема заключалась в том, что при конфигурации asp.net я должен был отключить анонимный доступ для того, чтобы использовать аутентификацию MembershipProvider:

system.web> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
... 
+0

Спасибо. Я действительно сбросил это сейчас, когда время сжалось. Я использую CustomUserNamePasswordValidator. Об этом здесь сообщается: http://bloggingabout.net/blogs/program.x/archive/2011/01/20/silverlight-and-asp-net-compatible-wcf-over-ssl.aspx Это то, что я хотел все время! –

0

Я не думаю, что вы можете установить основное разрешение на интерфейсе. Держу пари, если переместить его на метод реализации услуг будет работать

или, по крайней мере, начинают ломаться по другой причине (я в настоящее время застрял в этот момент - я получаю доступ запрещен исключения - надеюсь, вы не)

(я первый пытался поставить их на интерфейсе контракта также)

0

это правильная конфигурация для службы WCF самопринятого с SSL:

<?xml version="1.0"?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
    <connectionStrings> 
     <add name="mySqlConnection" connectionString="Data Source=.\SQLEXPRESS2012;Integrated Security=SSPI;Initial Catalog=aspnetdb;"/> 
    </connectionStrings> 
    <system.web> 
     <compilation debug="true"/> 
     <!-- Configure the Sql Membership Provider --> 
     <membership defaultProvider="MySqlMembershipProvider" userIsOnlineTimeWindow="15"> 
     <providers> 
      <clear/> 
      <add name="MySqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="mySqlConnection" applicationName="UsersManagementNavigationApplication" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Hashed"/> 
     </providers> 
     </membership> 

     <!-- Configure the Sql Role Provider --> 
     <roleManager enabled="true" defaultProvider="MySqlRoleProvider"> 
     <providers> 
      <clear/> 
      <add name="MySqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="mySqlConnection" applicationName="UsersManagementNavigationApplication"/> 
     </providers> 
     </roleManager> 
    </system.web> 
    <system.serviceModel> 
     <bindings> 
     <webHttpBinding> 
      <binding name="webBinding"> 
       <security mode="Transport"> 
        <transport clientCredentialType="Basic"/> 
       </security> 
      </binding> 
     </webHttpBinding> 
     <basicHttpBinding> 
      <binding name="basicBindingConfiguration"> 
       <security mode="Transport"> 
        <transport clientCredentialType="Basic"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
     </bindings> 
     <behaviors> 
     <endpointBehaviors> 
      <behavior name="webEndpointBehavior"> 
       <webHttp/> 
      </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
      <behavior name="webServiceBehavior"> 
       <serviceMetadata httpsGetEnabled="true"/> 
       <serviceThrottling/> 
       <serviceDebug/> 
      </behavior> 
      <behavior name="myServiceBehavior"> 
       <!-- Configure role based authorization to use the Role Provider --> 
       <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="MySqlRoleProvider"> 
       </serviceAuthorization> 
       <serviceCredentials> 
        <!-- Configure user name authentication to use the Membership Provider --> 
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WcfServiceHTTPSSelfHosted.MyCustomValidator, WcfServiceHTTPSSelfHosted" /> 
       </serviceCredentials> 
       <!-- To avoid disclosing metadata information, set the value below to false before deployment --> 
       <serviceMetadata httpsGetEnabled="true"/> 
       <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
       <serviceDebug includeExceptionDetailInFaults="false"/> 
      </behavior> 
     </serviceBehaviors> 
     </behaviors> 
     <services> 
     <service behaviorConfiguration="myServiceBehavior" name="WcfServiceHTTPSSelfHosted.WcfServiceHTTPSSelfHosted"> 
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicBindingConfiguration" contract="WcfServiceHTTPSSelfHosted.IWcfServiceHTTPSSelfHosted"/> 
      <endpoint address="web" behaviorConfiguration="webEndpointBehavior" binding="webHttpBinding" bindingConfiguration="webBinding" contract="WcfServiceHTTPSSelfHosted.IWcfServiceHTTPSSelfHosted"/> 
      <endpoint address="mex" binding="mexHttpsBinding" bindingConfiguration="" contract="IMetadataExchange"/> 
      <host> 
       <baseAddresses> 
        <add baseAddress="https://localhost:50001/WcfServiceHTTPSSelfHosted/"/> 
       </baseAddresses> 
      </host> 
     </service> 
     </services> 
    </system.serviceModel> 
</configuration> 

если вы хотите больше информации взгляните это :

http://www.albertoschiassi.it/Home/tabid/55/EntryId/94/Use-ASP-NET-SqlMemberShipProvider-in-WCF-self-hosted-service.aspx

и

http://www.albertoschiassi.it/Home/tabid/55/EntryId/95/Use-ASP-NET-SqlMemberShipProvider-in-WCF-self-hosted-service-with-SSL.aspx

Смежные вопросы