我有一个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调用我的端点时,是否有人在这种情况下有一些认证可以正常工作?
答案 0 :(得分:1)
总而言之,您有以下情况:
您需要解决的第一个问题是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字节的随机值:ChalengeValue
和CorrelationToken
,并将它们与有效负载一起插入到某个存储器中,如下所示:
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
如果查询返回一行并且CorrelationToken
和ChanlengeValue
匹配,并且尚未过期,则服务器连接到sharepoint,在{{1}上查找ID = 4133
的项目}} list,ands检查AuhenticationChalenges
是否等于ChalengeValue
,最后检查E38A022B7F744D3BA8C676259AECD607
用户ID是否等于CreatedBy
。如果所有检查都成功,则它会响应并确定响应并设置身份验证cookie。如果任何检查失败,则以401结果响应。