SharePoint 2010 自定义 WCF 服务 - Windows 和 FBA 身份验证
Posted
技术标签:
【中文标题】SharePoint 2010 自定义 WCF 服务 - Windows 和 FBA 身份验证【英文标题】:SharePoint 2010 Custom WCF Service - Windows and FBA Authentication 【发布时间】:2011-06-24 05:39:20 【问题描述】:我已为 基于声明的身份验证 配置了 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());
在声明和尝试同时使用 Windows 和 FBA 时,我对 IIS 安全设置/配置有些缺乏经验。在涉及安全性的 WCF 配置时,我也缺乏经验。我通常开发内部商业应用程序并让 Visual Studio 决定使用什么,因为安全性很少受到关注。
【问题讨论】:
【参考方案1】:我想我找到了答案。关键是创建一个 web.config 文件并部署在与 .svc 文件相同的文件夹中。 web.config 文件需要指定绑定以使用“wsHttpBinding”而不是“basicHttpBinding”。我还删除了 .svc 声明中的 Factory 属性和类上的 BasicHttpBindingServiceMetadataExchangeEndpoint 属性。
【讨论】:
您能否发布完整的 web.config 文件作为解决方案?我在 WCF 和 2010 基于声明的身份验证方面遇到了类似的问题。以上是关于SharePoint 2010 自定义 WCF 服务 - Windows 和 FBA 身份验证的主要内容,如果未能解决你的问题,请参考以下文章
安全模型 - 调用 WCF 服务的 SharePoint 2010 Silverlight Web 部件
使用sharepoint 2010异步的wcf下载(获取流)文件
在声明身份验证的 SharePoint 2010 中托管的 WCF 服务中的模拟
SharePoint 2010/Silverlight:以编程方式传递自定义参数