У меня SharePoint 2010 настроен для проверки подлинности на основе утверждений как с Windows , так и с проверкой подлинности на основе форм (FBA) для внешних пользователей. Мне также нужно разработать настраиваемые службы WCF . Проблема в том, что я хочу, чтобы учетные данные Windows передавались в службы WCF; однако мне кажется, что я не могу передать учетные данные Windows службам. Моя настраиваемая служба WCF, похоже, использует анонимную аутентификацию (которая должна быть включена в IIS для отображения экрана входа в систему FBA).
Пример, которому я пытался следовать, находится на http://msdn.microsoft.com/en-us/library/ff521581.aspx .
Служба WCF развертывается в _vti_bin (папка ISAPI).
Вот код для файла .svc
<%@ ServiceHost Language="C#" Debug="true"
Service="MyCompany.CustomerPortal.SharePoint.UI.ISAPI.MyCompany.Services.LibraryManagers.LibraryUploader, $SharePoint.Project.AssemblyFullName$"
Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressBasicHttpBindingServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
CodeBehind="LibraryUploader.svc.cs" %>
Вот код для файла .svc
[ServiceContract]
public interface ILibraryUploader
{
[OperationContract]
string SiteName(); }
[BasicHttpBindingServiceMetadataExchangeEndpoint]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class LibraryUploader : ILibraryUploader
{
//just try to return site title right now…
public string SiteName()
{
WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
ClaimsIdentity claimsIdentity = new ClaimsIdentity(identity);
return SPContext.Current.Web.Title;
}
}
Тестовый клиент WCF, который мне нужно просто проверить (приложение WPF), использует следующий код для вызова службы WCF ...
private void Button1Click(object sender, RoutedEventArgs e)
{
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
EndpointAddress endpoint =
new EndpointAddress(
"http://dev.portal.data-image.local/_vti_bin/MyCompany.Services/LibraryManagers/LibraryUploader.svc");
LibraryUploaderClient libraryUploader = new LibraryUploaderClient(binding, endpoint);
libraryUploader.ClientCredentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Impersonation;
MessageBox.Show(libraryUploader.SiteName());
}
Я несколько неопытен с настройками / конфигурациями безопасности IIS, когда дело доходит до претензий, и попытки использовать как Windows, так и FBA. Я также неопытен, когда дело касается конфигураций WCF для обеспечения безопасности. Обычно я разрабатываю внутренние бизнес-приложения и позволяю Visual Studio решать, что использовать, потому что безопасность редко вызывает беспокойство.