Аутентификация вызова WCF из Silverlight с использованием ADAM (AD LDS) - PullRequest
1 голос
/ 01 июля 2010

У меня есть клиент Silverlight 4, который вызывает несколько служб WCF. Мы хотим, чтобы связь была зашифрована с использованием SSL (у меня эта часть уже решена) и чтобы каждый вызов проходил проверку подлинности с использованием AD LDS (ADAM). У вас есть простой пример, показывающий, как заставить это работать? Существует множество документации по очень многим параметрам WCF, но я не смог найти простой рабочий пример этого конкретного (но я думаю, очень распространенного) сценария (шифрование SSL + аутентификация ADAM + Silverlight). Любая помощь или указатели очень ценятся.

Ответы [ 4 ]

0 голосов
/ 10 сентября 2010

Эдгар, я также заинтересован в любых ваших результатах, я на том же месте, где вы были.

Shoaib, я смотрел на это, но я думаю, что это менее желательно, чем использование только.config через ActiveDirectoryMembershipProvider, так как тогда вы просто используете готовые компоненты, а не пишете свою собственную систему безопасности.

РЕДАКТИРОВАТЬ: Надеюсь, это кому-нибудь поможет.Я не могу поверить, что нет хорошего примера этого в Интернете.Это достаточно просто.Как я уже говорил, это лучше, чем использовать пользовательскую систему аутентификации.

Использование аутентификации AD LDS (ADAM) с совместимыми с Silverlight вызовами WCF (не wsHttp)

Клиентская сторона:

1) Вызовы из Silverlight выглядят следующим образом, это работает, если вы также используете фабрику каналов.

var client = new MyWCFServiceClient();
client.GetPersonCompleted += client_GetPersonCompleted;
client.ClientCredentials.UserName.UserName = username;
client.ClientCredentials.UserName.Password = password;
client.GetPersonAsync();

2) возвращаемые значения с сервера будут иметь свойство Error в случае сбоя входа в систему.Если при поиске пользователя происходит сбой, возникает ошибка, которая напоминает «по крайней мере один токен безопасности не может быть проверен»Так как ваш код на стороне сервера не может перефразировать это (как все это происходит в web.config), лучше для вашего клиентского кода перехватить System.ServiceModel.Security.MessageSecurityException и интерпретировать его как ошибку входа в систему или проверитьсообщение InnerException, чтобы убедиться, что это «маркер безопасности».

void client_GetPersonCompleted(object sender, GetPersonCompletedEventArgs e)
{
if (e.Error == null)
{
     // do stuff with e.Result;
}
if (e.Error is MessageSecurityException)
{
    // Your login did not work
}
}

Сторона сервера:

1) Класс обслуживания WCF должен иметь [AspNetCompatibilityRequirements (RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] или Обязательно

2) вам нужно настроить экземпляр LDS с включенным SSL, что сложно.Смотрите: h't't'p: //erlend.oftedal.no/blog/? Blogid = 7

3) веб-конфигурация - необходимо:

  1. Добавить LDSСтрока подключения
  2. Добавить ActiveDirectoryMembershipProvider
  3. Добавить <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  4. изменить пользовательскую привязку, чтобы включить <security authenticationMode="UserNameOverTransport"/> см. http://msdn.microsoft.com/en-us/library/dd833059(VS.95).aspx

Пример:

<configuration>

  <connectionStrings>
    <add name="ADConnectionString" connectionString="LDAP://myserver:[SSL port number]/[where your user are in LDS, in my case: ‘OU=ADAM Users,O=Microsoft,C=US’]" />
  </connectionStrings>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <membership defaultProvider="MyActiveDirectoryMembershipProvider">
      <providers>
        <add
          name="MyActiveDirectoryMembershipProvider"
          type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
          connectionStringName="ADConnectionString"
          connectionUsername="[domain]\[username]"
          connectionPassword="[plain text windows password]"
          connectionProtection="Secure"
            />
      </providers>
    </membership>
  </system.web>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehaviour">
          <serviceMetadata
            httpsGetEnabled="true"
            httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="false" />

          <serviceCredentials>
            <userNameAuthentication
              userNamePasswordValidationMode="MembershipProvider"
              membershipProviderName="MyActiveDirectoryMembershipProvider"/>
          </serviceCredentials>

        </behavior>
      </serviceBehaviors>
    </behaviors>

    <bindings>
      <customBinding>
        <binding name="myCustomBinding">
          <security authenticationMode="UserNameOverTransport"/>
          <!--            <binaryMessageEncoding /> this is optional, but good for performance-->
          <httpsTransport />
        </binding>
      </customBinding>
    </bindings>

    <services>
      <service name="MessageBasedSecurity.Web.MyWCFService" behaviorConfiguration="MyServiceBehaviour">
        <endpoint address="" binding="customBinding" bindingConfiguration="myCustomBinding"
            contract="MessageBasedSecurity.Web.MyWCFService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

  </system.serviceModel>
</configuration>

Надеюсь, это кому-нибудь поможет.Я приветствую комментарии / улучшения.

0 голосов
/ 01 июля 2010

Попробуйте эту ссылку на веб-сайте Codeplex, похоже, это настройка и конфигурация для сценария, который вы описали. Он предоставляет полный контрольный список всех необходимых настроек:

Интранет - Интернет для удаленного WCF с использованием безопасности транспорта (Trusted Subsystem, HTTP)

Если это не ваш точный сценарий, взгляните на следующий раздел, который может заполнить пробелы:

Сценарии приложений (безопасность WCF)

0 голосов
/ 07 августа 2010

Ответ может зависеть от того, как вы будете обрабатывать разрешения, поскольку вы используете поставщик членства ASP.net для этих функций.

Если вы хотите авторизацию на основе утверждений, ADFS 1.0 (не 2.0) поддерживает ADAM. Если вы хотите, чтобы у STS было больше опций, попробуйте codplex StarterSTS

Если вы хотите использовать ролевое администрирование, попробуйте Enterprise Library от Microsoft P & P, поставщика членства *1007* ASP.net * или прямой COM-доступ к Диспетчер авторизации (ранее известный как AzMan)

Я предпочитаю и использую подход, основанный на утверждениях:

0 голосов
/ 01 июля 2010

Вы можете использовать CustomUserNameValidator в WCF: http://msdn.microsoft.com/en-us/library/aa702565.aspx http://nayyeri.net/custom-username-and-password-authentication-in-wcf-3-5

и в методе проверки пользовательского валидатора вы можете запросить ADAM для аутентификации пользователя.

С уважением.

...