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

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


我引用的文章声明我负责认证机制。我只是想不出一个真正安全的方法,而且网上也没有这样的例子。我真的很想以某种方式利用SharePoint用户的身份,因为只有SharePoint用户会访问Web API端点,我只是不知道如何。SP.RequestExecutor在命中端点时不允许我传递SPHostUrl querystring参数,因此我无法使用SharePoint和远程应用程序之间的信任关系。是否有人对使用SP.RequestExecutor调用我的端点时在这种情况下可以很好地工作的身份验证有一些想法?

总结一下,您有以下情况:

  • 您有一个SharePoint加载项(SharePoint应用程序)
  • 外接程序web(应用程序web)上的页面需要调用外部服务
  • 您有一个使用ASP.NET Web Api实现的外部服务
  • 外部服务需要身份验证
您需要解决的第一个问题是。为解决此问题,Microsoft文档介绍了三种选项:

然而,我认为最好的选择是使用,因为它是一个,它更简单,更容易使用,全面,无黑客,特别:

要解决的另一个问题是身份验证。不幸的是,Microsoft文档没有提供任何示例或提示,它只是告诉您这是您的责任。搜索web也不会提供任何示例或提示。因此我得出结论:您需要发明一种身份验证机制。一些身份验证协议基于挑战,如NTLM身份验证。电子邮件地址验证也使用挑战,它挑战您阅读发送到电子邮件地址的电子邮件。我向你们提出了一个基于相同范例的机制。我要求用户在SharePoint应用程序Web(加载项)上创建特定列表项。因此,我们需要一个名为
AutenticationChalenges
的应用程序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"
}
{
    "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结果响应