SharePoint 2013跨域库方案:远程应用程序的身份验证机制
我有一个SharePoint提供商托管的应用程序,它公开了一个Web API端点。我使用这个端点作为中间人来调用安全的外部web服务。我想通过主机Web中SharePoint页面(发布页面)中的javascript调用我的Web API端点。因为这是一个跨域调用,所以我正在使用SharePoint的跨域库(SP.RequestExecutor.js)。我按照中的步骤创建了跨域库所需的自定义代理页面。一切正常。我可以通过SP.RequestExecutor调用我的服务,没有问题。现在,我只想要求对访问Web API端点进行身份验证SharePoint 2013跨域库方案:远程应用程序的身份验证机制,sharepoint,asp.net-web-api,sharepoint-online,sharepoint-apps,Sharepoint,Asp.net Web Api,Sharepoint Online,Sharepoint Apps,我有一个SharePoint提供商托管的应用程序,它公开了一个Web API端点。我使用这个端点作为中间人来调用安全的外部web服务。我想通过主机Web中SharePoint页面(发布页面)中的javascript调用我的Web API端点。因为这是一个跨域调用,所以我正在使用SharePoint的跨域库(SP.RequestExecutor.js)。我按照中的步骤创建了跨域库所需的自定义代理页面。一切正常。我可以通过SP.RequestExecutor调用我的服务,没有问题。现在,我只想要求对
我引用的文章声明我负责认证机制。我只是想不出一个真正安全的方法,而且网上也没有这样的例子。我真的很想以某种方式利用SharePoint用户的身份,因为只有SharePoint用户会访问Web API端点,我只是不知道如何。SP.RequestExecutor在命中端点时不允许我传递SPHostUrl querystring参数,因此我无法使用SharePoint和远程应用程序之间的信任关系。是否有人对使用SP.RequestExecutor调用我的端点时在这种情况下可以很好地工作的身份验证有一些想法?总结一下,您有以下情况:
- 您有一个SharePoint加载项(SharePoint应用程序)
- 外接程序web(应用程序web)上的页面需要调用外部服务
- 您有一个使用ASP.NET Web Api实现的外部服务
- 外部服务需要身份验证
AutenticationChalenges
的应用程序Web列表,其中包含以下字段:
:自动递增内置字段ID
:单行文本ChanlengeValue
:用户内置字段CreatedBy
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"
}
{
"ChalengeItemId" : 4133, // the ID column of the AuthenticationChalenges SharePoint list
"ChalengeId" : 31232,
"CorrelationToken" : "95AE040FE6844345B36B5E33BE03437F",
"ChalengeValue" : "E38A022B7F744D3BA8C676259AECD607"
}
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.-应用程序网页上的JavaScript将项目插入身份验证通道列表设置challengevalue
列=“E38A022B7F744D3BA8C676259AED607”
并调用https://myexternalservice.mycompay.com/login
web api端点具有以下负载:
{
"UserId": "3432" // the SharePoint UserId
"AppWebUrl": "https://mysharpointonline-e849d5bbe0ddc2.sharepoint.com/MySharePointApp"
"HostWebUrl": "https://mysharepointonline.sharepoint.com/MySharePointApp"
}
{
"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,在AuhenticationChallenges
列表中查找ID=4133
的项目,ands检查chalengValue
是否等于E38A022B7F744D3BA8C676259AECD607
,最后检查CreatedBy
用户id是否等于3432
。如果all检查成功,那么它将使用和ok响应进行响应,并设置身份验证cookie。如果任何一个检查失败,那么它将以401结果响应