Пользовательская служба WCF SharePoint 2010 - проверка подлинности Windows и FBA - PullRequest
6 голосов
/ 09 февраля 2011

У меня 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 решать, что использовать, потому что безопасность редко вызывает беспокойство.

1 Ответ

0 голосов
/ 09 февраля 2011

Кажется, я понял ответ. Ключ заключается в создании файла web.config и развертывании в той же папке, что и файл .svc. В файле web.config необходимо указать привязку, чтобы использовать « wsHttpBinding » вместо « basicHttpBinding ». Я также удалил атрибут Factory в объявлении .svc и атрибут BasicHttpBindingServiceMetadataExchangeEndpoint для класса.

...