嗨,我是一位应用程序设计人员,我喜欢进行开发,但是,老实说 - 如果我需要追踪一个以上有关新 SharePoint 应用程序的「Token 的发行者不是受信任发行者」问题,那么我可能会对着计算机大声嘶吼。为了尝试协助您保护您的声音 (和理智),我将从此处列出的事项列表开始 (这是我在遇到此问题时所查看的清单)。当我发现引发此问题和可解决该问题之令人兴奋的新方法时,就会更新此处的文章,并在下方掷出「已更新!」的字样。
请务必记住,当我说「高信任度应用程序」时,表示您并未使用 ACS 做为 SharePoint 应用程序的信任代理人;而是您的应用程序会改为建立 OAuth Token 并利用您自己的凭证来签署它。我知道我们已在他处详细记载这整个程序,因此不打算在此再次说明此程序。我将假设您已阅读过该程序且已尝试执行该程序,而现在您已经准备好来向您的屏幕举手致敬。但是,话虽如此,我还是会在此处提供看见此错误发生的方法:
1.新增至 SPTrustedRootAuthority 清单 - 当您使用凭证来签署 OAuth Token 时,需要建立 New-SPTrustedRootAuthority。就像 SharePoint 2010 中的 New-SPTrustedIdentityTokenIssuer,您需要将 Token 签署的凭证和链结中的每个凭证新增至 SharePoint 的信任授权单位列表。您可以遵循此程序的相同步骤,如同我在下列文章中所述:
http://blogs.technet.com/b/speschka/archive/2010/02/13/root-of-certificate-chain-not-trusted-error-with-claims-authentication.aspx (可能为英文网页)。只需忽略从 ADFS 导出凭证的相关信息即可 - 我假设您已经透过某些其他工具,为您的高信任度应用程序建立凭证 - 公用根 CA (例如,GoDaddy、VeriSign 等)、自我签署凭证或网域发出的凭证。
2.客户端标识符使用全部大写的字符 - 如同我在其他文章中所述,请确定当您在应用程序的 AppManifest.xml 档案中插入客户端标识符时,不会使用大写字母,或者如果您正在建置自我装载的解决方案,不会在 Web 应用程序的 web.config 中使用大写字母。如需更多详细信息,请参阅 http://blogs.technet.com/b/speschka/archive/2012/07/28/an-important-tip-about-client-id-values-for-s2s-apps-in-sharepoint-2013.aspx (可能为英文网页)。
3.未将 Token 发行者设为信任代理人 - 我曾在下列文章中说明过此问题:http://blogs.technet.com/b/speschka/archive/2012/09/27/another-apps-for-sharepoint-tip-with-the-error-quot-the-issuer-of-the-token-is-not-a-trusted-issuer-quot.aspx (可能为英文网页)。此处的陷阱是确定当您建立 New-SPTrustedSecurityTokenIssuer 时会包含 -IsTrustBroker 旗标。
4.已更新!:web.config 中遗漏 IssuerId 密钥 - 若要在 SharePoint 2013 中使用应用程序的信任代理人功能,您的应用程序在建立要传送至 SharePoint 的 JWT Token 时必须知道信任代理人的 IssuerId 是什么。它知道此密钥的方法是透过查看 web.config 中名为 IssuerId 的应用程序属性。它可以前往您应用程序之 web.config 中与 ClientId、ClientSecret 等相同的位置。只需查看如下的内容:。
5.已更新!:使用适用于 Visual Studio 的 Office 工具 RTM Preview - 实际上在 RTM Preview 中某种程度上有一点小错误,但已在 Preview 2 中修正。将授权 Token 传送至 SharePoint 的程序代码不会在 web.config 中寻找 IssuerId 元素,而是会传送其他值。它传送的内容及原因实际上并不重要;重要的是,您使用该版本的工具来解决此问题的方式,是一律在 web.config 中针对 ClientId 密钥的 SPTrustedSecurityTokenIssuer 使用 IssuerId 值。当您取得 Preview 2 时,请立即安装它们,并将 ClientId 变更为您所建立并登录的唯一 GUID (利用如下所述的 Register-SPAppPrincipal)。您不想让 ClientId 全都一样,因为它会识别哪个应用程序已签署 OAuth Token,,并在整个 SharePoint UI 中使用。当您需要进行任何疑难解答或稽核时,若所有应用程序都使用相同值,就会发生问题。
现在,还有一个相关问题值得注意:假设您「认为」已经解决此错误,但接着在自我装载的应用程序中尝试撷取来自 SharePoint 网站的内容时收到「拒绝存取」的错误?这可能意味着:
1.适用于 SharePoint 应用程序之 AppManifest.xml 档案中的 ClientId 值,与适用于您自我装载应用程序之 web.config 中的 ClientId 值不符。我们已对 Visual Studio 工具进行改进, 应该能够减少发生此问题的情况。
现在,几乎一样重要的问题是,我如何在发生这类情况时进行追踪?喔,如果很容易的话,我就不需要大声嘶吼,也不需要向我的屏幕举手致敬了。不过,我已经找到目前可在此问题发生时使用的最佳数据源。再次提醒,当我找到新信息时,就会新增至清单中:
1.ULS 记录 - 多年来的最爱,特别是在假日聚会时,我喜欢开启 ULS 记录,就只是纯粹欣赏数据量。好啦,这只是个讽刺罢了。但是,您真正可以做的是移至管理中心、监视、设定诊断记录。展开 SharePoint Foundation 类别,然后选取下列项目:App Auth、应用程序验证、验证授权及宣告验证。针对这些项目将记录和追踪层级设定为 [详细数据] 并储存您的变更,然后继续尝试再次启动您的应用程序。撷取数个 ULS 记录检视工具之一来查看传入与处理的要求。搜集关于您应用程序验证问题的提示是个好方法。
2.Fiddler - 也是粉丝的最爱,Fiddler 对于这些情况也很有用。您最常看见的是 401 未经授权的错误 (就像每次的基本问题都是「Token 的发行者不是受信任发行者」)。如果您查看要求的最后一个框架,然后单击 [响应] 框架中的 [标头] 索引卷标,将看见 WWW-Authenticate Cookie,如下所示:Bearer realm="8a96481b-6c65-4e78-b2ef-a446adb79b59",client_id="00000003-0000-0ff1-ce00-000000000000",trusted_issuers="e9134021-0180-4b05-9e7e-0a9e5a524965@8a96481b-6c65-4e78-b2ef-a446adb79b59,00000003-0000-0ff1-ce00-000000000000@8a96481b-6c65-4e78-b2ef-a446adb79b59"。那么,您可以从中获得什么?嗯,我知道在查看此内容时,会预期我的 ClientId 值是 e9134021-0180-4b05-9e7e-0a9e5a524965,并预期我的领域是 8a96481b-6c65-4e78-b2ef-a446adb79b59。ClientId 值很容易检查 - 我可以查看适用于我的自我装载应用程序的 AppManifest.xml 档案和 web.config。虽然不太可能发生领域错误的情况,但您一律可透过执下列 PowerShell 来进行验证:
$spurl ="https://foo"
$spsite = Get-SPSite $spurl
$realm = Get-SPAuthenticationRealm -ServiceContext $spsite
$realm
不论领域为何,这样做都会将领域输出至画面。最后,有一件您可以进行验证的其他事项 - 确定您已针对所使用的 ClientId 建立 appPrincipal。再次提醒,以下是一些您可用来检查的 PowerShell (这会使用上述的 WWW-Authenticate 标头):
Get-SPAppPrincipal -NameIdentifier e9134021-0180-4b05-9e7e-0a9e5a524965@8a96481b-6c65-4e78-b2ef-a446adb79b59 -Site https://foo
如果您收到错误或没有产生任何结果,则会知道您不具有效的 SPAppPrincipal,所以需要使用 PowerShell 来建立一个。为了完整起见,以下提供一个范例:
$clientId = "一些您建立的 GUID"
$spurl ="https://foo"
$spsite = Get-SPSite $spurl
$realm = Get-SPAuthenticationRealm -ServiceContext $spsite
$fullAppIdentifier = $clientId + '@' + $realm
$appPrincipal = Register-SPAppPrincipal -NameIdentifier $fullAppIdentifier -Site $spsite.OpenWeb() -DisplayName "我的超酷应用程序"
好的,今天光是讲解对于高信任度应用程序疑难解答秘诀的列表就已经精疲力竭了 (我也一样)。当我有更多消息时 (或者如果有的话),将会更新本文。