我有两个sharepoint站点在一个sharepoint安装中运行。一个站点启用了声明,另一个站点启用了经典身份验证。两个站点都使用Kerberos。
我使用ManifoldCF连接到这些网站以提取所有内容以及权限。 ManifoldCF连接器连接到启用了经典身份验证的站点,并按预期工作。但是,尝试抓取基于声明的网站会产生401未经授权的错误。
ManifoldCF提供了一个名为MCPermissions.asmx的Web服务包。此文件包含以下代码块,用于设置用户的凭据:
try
{
// Only handle requests for "item". Send all other requests to the SharePoint web service.
if (objectType.Equals(itemType))
{
retVal = GetItemPermissions(objectName);
}
else
{
ServicePointManager.ServerCertificateValidationCallback +=
new RemoteCertificateValidationCallback(ValidateCertificate);
using (SPPermissionsService.Permissions service = new SPPermissionsService.Permissions())
{
service.Url = SPContext.Current.Web.Url + "/_vti_bin/Permissions.asmx";
service.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
retVal = service.GetPermissionCollection(objectName, objectType);
}
}
}
catch (SoapException soapEx)
{
throw soapEx;
}
catch (Exception ex)
{
SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("MCPermissions.asmx", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, "Error: "+ex.Message+"; SPContext.Current.Web.Url='"+SPContext.Current.Web.Url+"'", ex.StackTrace);
throw RaiseException(ex.Message, "1000", ex.Source);
}
此代码可以通过ManifoldCF正确访问,但似乎是在/_vti_bin/Permissions.asmx插件中发出的导致401问题的请求。
我尝试使用NetworkCredential在上面的代码中设置预定义的凭据 (“用户名”,“密码”,“域名”)但没有运气。
示例:
string webUrl = SPContext.Current.Web.Url;
NetworkCredential myCredentials = new NetworkCredential("DOMAIN\\user", "mypassword", "DOMAIN");
CredentialCache credCache = new CredentialCache();
credCache.Add(new Uri(webUrl), "Negotiate", myCredentials);
service.Url = webUrl + "/_vti_bin/Permissions.asmx";
service.Credentials = credCache;
使用基于声明的身份验证,我输入ManfoldCF或浏览器身份验证的用户名从常规\格式更改为声明用户名格式(例如i:0#.w || /)。
有人知道为什么基于声明会导致401问题,而经典身份验证不会?
答案 0 :(得分:0)
原来这是ManifoldCF 1.2版本的一个错误。它已在新版本中修复。