SharePoint 2013跨域库方案:远程应用程序的身份验证机制

时间:2015-02-13 04:27:09

标签: sharepoint asp.net-web-api sharepoint-online sharepoint-apps

我有一个SharePoint提供程序托管的应用程序,它公开了一个Web API端点。我正在使用此端点作为中间人来调用安全的外部Web服务。我想通过主机Web中的SharePoint页面(发布页面)中的javascript调用我的Web API端点。由于这是一个跨域调用,我正在使用SharePoint的跨域库(SP.RequestExecutor.js)。我按照this article中的步骤创建了跨域库所需的自定义代理页面。一切正常。我可以通过SP.RequestExecutor调用我的服务,没有任何问题。现在,我只想要访问Web API端点的身份验证。

我引用的文章指出我负责认证机制。我似乎无法想出一个真正安全的,网上几乎没有例子。我真的想以某种方式利用SharePoint用户的身份,因为只有SharePoint用户才会访问Web API端点,我只是无法弄清楚如何。 SP.RequestExecutor不会让我在命中端点时传递SPHostUrl查询字符串参数,这就是为什么我不能使用SharePoint和远程应用程序之间的信任关系。在使用SP.RequestExecutor调用我的端点时,是否有人在这种情况下有一些认证可以正常工作?

1 个答案:

答案 0 :(得分:1)

总而言之,您有以下情况:

  • 您已添加SharePoint(SharePoint App)。
  • 添加网页(应用程序网页)上的页面需要调用外部服务。
  • 您使用ASP.NET Web Api实现了外部服务。
  • 外部服务需要身份验证。

您需要解决的第一个问题是Same Origin Policy。为解决此问题,Microsoft文档介绍了三个选项:

但是,我认为最好的选择是使用CORS,因为它是W3C recommendation,它更简单,更易于使用,更全面,无黑客,特别是:{{ 3}}

要解决的另一个问题是身份验证。不幸的是,Microsoft文档没有提供任何示例或提示,它只是告诉您它的责任。搜索网络也不提供任何示例或提示。所以我总结说:你需要发明一种认证机制。几种身份验证协议基于诸如NTLM身份验证之类的挑战。电子邮件地址验证也使用了一个挑战,它会让您阅读发送到电子邮件地址的电子邮件。我建议你一个基于相同范式的机制。我挑战用户在SharePoint App Web上创建特定的列表项(添加)。因此,我们需要在App Web上使用名为AutenticationChalenges的列表,其中包含以下字段:

  • ID:内置自动增量。
  • ChanlengeValue:单行文字。
  • CreatedBy:用户内置字段。

身份验证过程具有以下步骤:

1.- App网页上的JavaScript使用以下有效负载调用https://myexternalservice.mycompay.com/create-chalenge web api端点:

{
    "UserId": "3432" // the SharePoint UserId
    "AppWebUrl": "https://mysharpointonline-e849d5bbe0ddc2.sharepoint.com/MySharePointApp"
    "HostWebUrl": "https://mysharepointonline.sharepoint.com/MySharePointApp"
}

2.-外部服务器生成两个16-32字节的随机值:ChalengeValueCorrelationToken,并将它们与有效负载一起插入到某个存储器中,如下所示:

CREATE SEQUENCE authentication_chalenges_authentication_chalenge_id_seq
START WITH 1;

CREATE TABLE authentication_chalenges
(
    authentication_chalenge_id int NOT NULL DEFAULT NEXT VALUE FOR authentication_chalenges_authentication_chalenge_id_seq
    CONSTRAINT authentication_chalenges_authentication_chalenge_id_seq PRIMARY KEY,
    user_id int NOT NULL,
    correlation_token binary(16) NOT NULL,
    chalenge_value binary(16) NOT NULL,
    app_web_url varchar(4000) NOT NULL,
    host_web_url varchar(4000) NULL,
    created_timestamp datetime NOT NULL
)

然后,服务器返回以下结果:

{
    "ChalengeId": 31232, // the value of authentication_chalenge_id column of the table
    "CorrelationToken" : "95AE040FE6844345B36B5E33BE03437F",
    "ChalengeValue" : "E38A022B7F744D3BA8C676259AECD607"

}

3.- App Web页面上的JavaScript将项目插入AuthenticationChanlenges列表设置ChalengeValue列= "E38A022B7F744D3BA8C676259AECD607",并使用以下有效负载调用https://myexternalservice.mycompay.com/login web api端点:

{
    "ChalengeItemId" : 4133, // the ID column of the AuthenticationChalenges SharePoint list
    "ChalengeId" : 31232,
    "CorrelationToken" : "95AE040FE6844345B36B5E33BE03437F",
    "ChalengeValue" : "E38A022B7F744D3BA8C676259AECD607"
}

4.-外部服务服务器在chalenges表中查找行:

SELECT * FROM authentication_chalenges WHERE authentication_chalenge_id = 31232 

如果查询返回一行并且CorrelationTokenChanlengeValue匹配,并且尚未过期,则服务器连接到sharepoint,在{{1}上查找ID = 4133的项目}} list,ands检查AuhenticationChalenges是否等于ChalengeValue,最后检查E38A022B7F744D3BA8C676259AECD607用户ID是否等于CreatedBy。如果所有检查都成功,则它会响应并确定响应并设置身份验证cookie。如果任何检查失败,则以401结果响应。

相关问题