Эдгар, я также заинтересован в любых ваших результатах, я на том же месте, где вы были.
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) веб-конфигурация - необходимо:
- Добавить LDSСтрока подключения
- Добавить ActiveDirectoryMembershipProvider
- Добавить
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
- изменить пользовательскую привязку, чтобы включить
<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>
Надеюсь, это кому-нибудь поможет.Я приветствую комментарии / улучшения.