在 SharePoint 2010 中使用自定义声明提供程序在人员选取器中选择名称后名称消失
原文发布于 2011 年 6 月 28 日(星期二)
最近我发现了一个问题,而且这个问题很难追踪,因此我认为应当与大家共享这个问题和解决方案。在本例中,已经开发出一个自定义的声明提供程序,并用作 SPTrustedIdentityTokenIssuer 的默认声明提供程序,如这篇文章中所述:https://blogs.technet.com/b/speschka/archive/2010/04/28/how-to-override-the-default-name-resolution-and-claims-provider-in-sharepoint-2010.aspx(该链接可能指向英文页面)。它可能在某些情况下看起来工作正常 - 您可搜索某些内容,它会向您显示匹配项的列表,您从中选择一个匹配项,然后单击“确定”按钮。在某些情况下,一切运行良好 - 对话框消失后,您会在控件的类型中看到已解析的名称。此外,您还可在 FillResolve 方法中设置断点,然后对它进行单步调试。
但在某些情况下,您会看到以下行为:
- 人员选取器对话框关闭
- 控件中的类型为空 - nothing(已解析或相反)显示
- 如果您在 FillResolve 中设置断点,将绝不会命中它
- 如果您查看 ULS 日志记录,将看不到任何错误
在此情况下,我最终确定发生的情况是自定义声明提供程序添加的声明类型在 SPTrustedIdentityTokenIssuer 中没有对应的映射。例如,它创建了一个声明,其中声明类型为 https://schemas.steve.com/foo),但 SPTrustedIdentityTokenIssuer 的声明映射的列表中没有 https://schemas.steve.com/foo 的映射(有关声明映射的示例和声明映射的创建方式,请参阅 https://blogs.technet.com/b/speschka/archive/2010/02/17/creating-both-an-identity-and-role-claim-for-a-sharepoint-2010-claims-auth-application.aspx(该链接可能指向英文页面))。因此,自定义声明提供程序并不是添加一个 SharePoint 知道未在管道中某个位置映射的声明,而只是耗尽该声明,为您留下一个空屏幕,并且没有任何错误消息。这也是我花了很长时间才找出问题所在的原因。
对于这个特殊的问题,我最终拆解了 SPTrustedIdentityTokenIssuer 并重新创建它,但为已从人员选取器中消失的声明类型添加了一个新映射。我们再次运行代码,它立即恢复正常,这样一来就确认了问题和解决方案。
这是一篇本地化的博客文章。请访问 Name Disappears After Selecting in People Picker with Custom Claims Provider in SharePoint 2010 以查看原文