IIS 托管 ASP.NET 和 SharePoint 服务器库 - 身份验证/安全问题
IIS hosted ASP.NET and SharePoint server libraries - authentication / security issue
我目前正在从事一个项目,我们的重点是尽可能多地针对 SharePoint CSOM 库进行开发。
遗憾的是,CSOM 无法提供访问跨站点发布功能的可能性。因此,我们决定在目标 SharePoint 系统上部署 ASP.NET Web API Web 服务,该服务托管在单独的应用程序池中并使用 SSOM(服务器端 SharePoint 库)。
池标识具有完整的服务器场管理员权限,Web 应用程序配置为使用 Windows 凭据和模拟。
<configuration>
<appSettings></appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<authentication mode="Windows" />
<identity impersonate="true" />
</system.web>
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
</configuration>
到目前为止一切顺利。
但是,当我通过 IIS 使用 Web 服务 API 时,我得到一个 "UnauthorizedAccessException",即使是在尝试获取普通列表时也是如此:
using (var site = new SPSite(http://some.url))
{
var list = site.RootWeb.GetList(listUrl);
}
附加信息:访问被拒绝。 (HRESULT 异常:0x80070005 (E_ACCESSDENIED))
调用是使用 HttpClient 执行的:
var handler = new HttpClientHandler
{
UseDefaultCredentials = true
};
var client = new HttpClient(handler)
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = Client.PostAsync("http://serviceadress/api/controller", jsonContent).Result;
此外,执行该进程(控制台应用程序)的身份与池也是相同的身份 运行。
我错过了什么?我真的不明白这个问题。特别是因为当我在本地 运行 OWIN 主机中托管 Web 服务时,一切都很好用 - 为什么不在 IIS 中呢?
OWIN 主机代码:
using (WebApp.Start<ControllerTest>("http://localhost:9000/"))
{
// Create HttpCient and make a request to api/controller
var client = new HttpClient
{
Timeout = TimeSpan.FromSeconds(300.0)
};
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var jsonPost = JsonConvert.SerializeObject(argument);
var content = new StringContent(
jsonPost,
Encoding.UTF8,
"application/json");
var response = client.PostAsync(baseAddress + "api/controller", content).Result;
}
好的,问题已解决。问题不是 IIS 本身,而是 SharePoint ASP.NET 上下文。
当 运行 在这种情况下,您必须确保以正确的方式处理跨站点脚本保护。
E_ACCESSDENIED 是 IIS 中错误配置的结果。 Web 服务现在托管在与 SharePoint 相同的网站中。
我目前正在从事一个项目,我们的重点是尽可能多地针对 SharePoint CSOM 库进行开发。
遗憾的是,CSOM 无法提供访问跨站点发布功能的可能性。因此,我们决定在目标 SharePoint 系统上部署 ASP.NET Web API Web 服务,该服务托管在单独的应用程序池中并使用 SSOM(服务器端 SharePoint 库)。
池标识具有完整的服务器场管理员权限,Web 应用程序配置为使用 Windows 凭据和模拟。
<configuration>
<appSettings></appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<authentication mode="Windows" />
<identity impersonate="true" />
</system.web>
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
</configuration>
到目前为止一切顺利。
但是,当我通过 IIS 使用 Web 服务 API 时,我得到一个 "UnauthorizedAccessException",即使是在尝试获取普通列表时也是如此:
using (var site = new SPSite(http://some.url))
{
var list = site.RootWeb.GetList(listUrl);
}
附加信息:访问被拒绝。 (HRESULT 异常:0x80070005 (E_ACCESSDENIED))
调用是使用 HttpClient 执行的:
var handler = new HttpClientHandler
{
UseDefaultCredentials = true
};
var client = new HttpClient(handler)
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = Client.PostAsync("http://serviceadress/api/controller", jsonContent).Result;
此外,执行该进程(控制台应用程序)的身份与池也是相同的身份 运行。
我错过了什么?我真的不明白这个问题。特别是因为当我在本地 运行 OWIN 主机中托管 Web 服务时,一切都很好用 - 为什么不在 IIS 中呢?
OWIN 主机代码:
using (WebApp.Start<ControllerTest>("http://localhost:9000/"))
{
// Create HttpCient and make a request to api/controller
var client = new HttpClient
{
Timeout = TimeSpan.FromSeconds(300.0)
};
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var jsonPost = JsonConvert.SerializeObject(argument);
var content = new StringContent(
jsonPost,
Encoding.UTF8,
"application/json");
var response = client.PostAsync(baseAddress + "api/controller", content).Result;
}
好的,问题已解决。问题不是 IIS 本身,而是 SharePoint ASP.NET 上下文。
当 运行 在这种情况下,您必须确保以正确的方式处理跨站点脚本保护。
E_ACCESSDENIED 是 IIS 中错误配置的结果。 Web 服务现在托管在与 SharePoint 相同的网站中。