我们在Azure上运行了一个ASP.NET MVC Web应用程序,我们希望在其上公开SharePoint Online租户的搜索结果。 Web应用程序中的用户在Azure AD上进行身份验证,我们希望他们自己搜索(保留其身份而不使用系统帐户),以便他们只能在搜索结果中看到与其相关的项目。我认为这是一个非常普遍的要求。
使用SharePointPnPCoreOnline CSOM扩展,我们能够检索搜索结果:
var authManager = new OfficeDevPnP.Core.AuthenticationManager();
ClientContext clientContext = authManager.GetWebLoginClientContext("https://xxxxxx.sharepoint.com");
KeywordQuery keywordQuery = new KeywordQuery(clientContext);
keywordQuery.QueryText = "queryText";
SearchExecutor searchExecutor = new SearchExecutor(clientContext);
ClientResult<ResultTableCollection> results = searchExecutor.ExecuteQuery(keywordQuery);
clientContext.ExecuteQuery();
(GetWebLoginClientContext方法会弹出一个新窗口,如果用户凭据尚未经过身份验证,则会询问用户凭据。理想情况下,我们希望以静默方式完成此操作,但这是唯一可以实现的方法。)
在开发期间,一切正常 - 我们得到了预期的搜索结果。但是,一旦我们将Web应用程序发布到Azure,我们在尝试搜索时遇到以下错误:
502 - Web服务器在充当网关或代理服务器时收到无效响应。您正在查找的页面存在问题,无法显示。当Web服务器(充当网关或代理)与上游内容服务器联系时,它从内容服务器收到无效响应。
我们发现解决http 502错误的建议之一是清除浏览器缓存,但是在我们这样做之后它也不再适用于开发机器。弹出窗口现在只显示SharePoint Online租户主页而不显示任何登录提示,而不是显示请求用户凭据的弹出窗口。
有没有人对此有解释?
或者,如果没有,更好的方法是让用户在没有GetWebLoginClientContext方法显示的弹出窗口的情况下搜索SharePoint Online?
最终解决了这个问题,不是使用GetWebLoginClientContext
方法(弹出窗口供用户输入凭据),而是使用GetAzureADWebApplicationAuthenticatedContext
方法,该方法使用oauth访问令牌进行静默验证。问题是获取正确的令牌传递给方法,我们成功地通过使用MicrosoftGraphHelper.GetAccessTokenForCurrentUser(url)
找到了here