总而言之,您有以下场景:
- 您有一个 SharePoint 插件(SharePoint 应用程序)。
- add in web (app web) 上的页面需要调用外部服务。
- 您有一个使用 ASP.NET Web Api 实现的外部服务。
- 外部服务需要身份验证。
您需要解决的第一个问题是Same Origin Policy。为解决此问题,Microsoft 文档描述了您所知道的三个选项:
但是,我认为最好的选择是使用CORS,因为它是W3C 推荐的,它更简单、更容易使用、全面、无黑客攻击,特别是:ASP.NET Web API 2 支持 CORS。
另一个需要解决的问题是身份验证。不幸的是,Microsoft 文档没有提供任何示例或提示,它只是告诉您这是您的责任。搜索网络也没有提供任何示例或提示。所以我得出结论:您需要发明一种身份验证机制。一些身份验证协议基于 NTLM 身份验证等挑战。电子邮件地址验证也使用挑战,它挑战您阅读发送到电子邮件地址的电子邮件。我向您建议一种基于相同范式的机制。我要求用户在 SharePoint 应用程序 Web 上创建一个特定的列表项(加载项)。因此,我们需要在 App WebAutenticationChalenges
上使用以下字段调用一个列表:
ID
:内置字段的自动增量。
ChanlengeValue
: 单行文本。
CreatedBy
:用户内置字段。
认证过程有以下步骤:
1.- 应用网页上的 JavaScripthttps://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 网页上的 JavaScript 将一个项目插入AuthenticationChanlenges
列表设置ChalengeValue
列 =并使用以下负载"E38A022B7F744D3BA8C676259AECD607"
调用web api 端点:https://myexternalservice.mycompay.com/login
{
"ChalengeItemId" : 4133, // the ID column of the AuthenticationChalenges SharePoint list
"ChalengeId" : 31232,
"CorrelationToken" : "95AE040FE6844345B36B5E33BE03437F",
"ChalengeValue" : "E38A022B7F744D3BA8C676259AECD607"
}
4.- 外部服务服务器查找挑战表中的行:
SELECT * FROM authentication_chalenges WHERE authentication_chalenge_id = 31232
如果查询返回一行并且CorrelationToken
匹配ChanlengeValue
,并且它还没有过期,则服务器连接到共享点以查找列表中的项目,ID = 4133
并AuhenticationChalenges
检查ChalengeValue
是否等于E38A022B7F744D3BA8C676259AECD607
,最后检查CreatedBy
用户 id 是否等于3432
。如果所有检查都成功,那么它会以 ok 响应进行响应并设置身份验证 cookie。如果任何检查失败,则它会以 401 结果响应。