【问题标题】:IIS hosted ASP.NET and SharePoint server libraries - authentication / security issueIIS 托管 ASP.NET 和 SharePoint 服务器库 - 身份验证/安全问题
【发布时间】:2015-08-15 20:44:40
【问题描述】:

我目前正在开展一个项目,我们的重点是尽可能多地针对 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;
}

【问题讨论】:

    标签: asp.net iis sharepoint asp.net-web-api owin


    【解决方案1】:

    好的,问题已解决。问题不在于 IIS 本身,而在于 SharePoint ASP.NET 上下文。

    在该上下文中运行时,您必须确保以正确的方式处理跨站点脚本保护。

    Here is how

    E_ACCESSDENIED 是由 IIS 中的错误配置导致的。 Web 服务现在托管在与 SharePoint 相同的网站中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2011-11-10
      • 1970-01-01
      • 2011-07-05
      相关资源
      最近更新 更多