SharePoint 2013 跨域库场景:远程应用的认证机制
SharePoint 2013 Cross-Domain Library Scenario: Authentication Mechanism for Remote App
我有一个公开 Web API 端点的 SharePoint 提供商托管的应用程序。我将此端点用作中间人来调用安全的外部 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 调用我的端点时,是否有人对这种情况下的身份验证有一些想法?
总而言之,您有以下场景:
- 您有一个 SharePoint 插件(SharePoint 应用程序)。
- 插件web(app web)上的一个页面需要调用外部服务
- 您有一个使用 ASP.NET Web Api.
实现的外部服务
- 外部服务需要认证。
您需要解决的第一个问题是 Same Origin Policy。为解决此问题,Microsoft 文档描述了三个选项,如您所知:
不过,我认为最好的办法是使用 CORS because it is a W3C recommendation, it's simpler, easier to use, comprehensive, hack-free, and specially: ASP.NET Web API 2 supports CORS。
另一个要解决的问题是身份验证。不幸的是,Microsoft 文档没有提供任何示例或提示,它只是告诉您这是您的责任。搜索网络也没有提供任何示例或提示。所以我得出结论:您需要发明一种身份验证机制。一些身份验证协议基于挑战,例如 NTLM 身份验证。电子邮件地址验证也使用挑战,它会挑战您阅读发送到电子邮件地址的电子邮件。我向您推荐一种基于相同范例的机制。我要求用户在 SharePoint App Web(加载项)上创建一个特定的列表项。所以我们需要一个名为 AutenticationChalenges
的 App Web 列表,其中包含以下字段:
ID
: 字段内置自增。
ChanlengeValue
: 单行文本。
CreatedBy
: 用户内置字段。
认证过程有以下步骤:
1.- 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
,并将它们与有效负载一起插入到某个存储中,例如 table像下面这样:
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
)
然后,服务器returns得到如下结果:
{
"ChalengeId": 31232, // the value of authentication_chalenge_id column of the table
"CorrelationToken" : "95AE040FE6844345B36B5E33BE03437F",
"ChalengeValue" : "E38A022B7F744D3BA8C676259AECD607"
}
3.- 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.- 外部服务服务器查找关于挑战的行 table:
SELECT * FROM authentication_chalenges WHERE authentication_chalenge_id = 31232
如果查询 returns 一行与 CorrelationToken
和 ChanlengeValue
匹配,并且还没有过期,服务器连接到 sharepoint 寻找带有 [=28= 的项目] 在 AuhenticationChalenges
列表上,ands 检查 ChalengeValue
是否等于 E38A022B7F744D3BA8C676259AECD607
,最后检查 CreatedBy
用户 ID 是否等于 3432
。如果所有检查都成功,则它会以 ok 响应进行响应并设置身份验证 cookie。如果任何检查失败,则它会返回 401 结果。
我有一个公开 Web API 端点的 SharePoint 提供商托管的应用程序。我将此端点用作中间人来调用安全的外部 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 调用我的端点时,是否有人对这种情况下的身份验证有一些想法?
总而言之,您有以下场景:
- 您有一个 SharePoint 插件(SharePoint 应用程序)。
- 插件web(app web)上的一个页面需要调用外部服务
- 您有一个使用 ASP.NET Web Api. 实现的外部服务
- 外部服务需要认证。
您需要解决的第一个问题是 Same Origin Policy。为解决此问题,Microsoft 文档描述了三个选项,如您所知:
不过,我认为最好的办法是使用 CORS because it is a W3C recommendation, it's simpler, easier to use, comprehensive, hack-free, and specially: ASP.NET Web API 2 supports CORS。
另一个要解决的问题是身份验证。不幸的是,Microsoft 文档没有提供任何示例或提示,它只是告诉您这是您的责任。搜索网络也没有提供任何示例或提示。所以我得出结论:您需要发明一种身份验证机制。一些身份验证协议基于挑战,例如 NTLM 身份验证。电子邮件地址验证也使用挑战,它会挑战您阅读发送到电子邮件地址的电子邮件。我向您推荐一种基于相同范例的机制。我要求用户在 SharePoint App Web(加载项)上创建一个特定的列表项。所以我们需要一个名为 AutenticationChalenges
的 App Web 列表,其中包含以下字段:
ID
: 字段内置自增。ChanlengeValue
: 单行文本。CreatedBy
: 用户内置字段。
认证过程有以下步骤:
1.- 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
,并将它们与有效负载一起插入到某个存储中,例如 table像下面这样:
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
)
然后,服务器returns得到如下结果:
{
"ChalengeId": 31232, // the value of authentication_chalenge_id column of the table
"CorrelationToken" : "95AE040FE6844345B36B5E33BE03437F",
"ChalengeValue" : "E38A022B7F744D3BA8C676259AECD607"
}
3.- 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.- 外部服务服务器查找关于挑战的行 table:
SELECT * FROM authentication_chalenges WHERE authentication_chalenge_id = 31232
如果查询 returns 一行与 CorrelationToken
和 ChanlengeValue
匹配,并且还没有过期,服务器连接到 sharepoint 寻找带有 [=28= 的项目] 在 AuhenticationChalenges
列表上,ands 检查 ChalengeValue
是否等于 E38A022B7F744D3BA8C676259AECD607
,最后检查 CreatedBy
用户 ID 是否等于 3432
。如果所有检查都成功,则它会以 ok 响应进行响应并设置身份验证 cookie。如果任何检查失败,则它会返回 401 结果。