如何为部署在 SharePoint 网站上的聊天机器人配置 SSO?

时间:2021-01-18 15:39:57

标签: javascript azure azure-active-directory single-sign-on chatbot

我正在尝试使用 Power Virtual Agent Chatbot 在 SharePoint 网站上配置 SSO。我们使用 Azure 进行身份验证和 SSO。

我已经在 Power Virtual Agent 社区发布了帮助实现这一目标的帖子。我收到了这样的回复:“我们确实通过使用 HttpContextAccessor 获取登录用户名并在 exchangeTokenAsync 下将其作为 loginHint 传递;这样做有效。”但不知道如何实现这一点.

我正在使用以下代码,并且能够获取当前 SharePoint 网站的当前登录用户名和电子邮件 ID。

<script>
     ExecuteOrDelayUntilScriptLoaded(getCurrentUser, "sp.js");
          //getCurrentUser();
          var currentUser;

          function getCurrentUser() {
            console.log("Inside getCurrentUser");
            var ctx = new SP.ClientContext.get_current();
            var web = ctx.get_web();
            currentUser = web.get_currentUser();
            ctx.load(currentUser);
            ctx.executeQueryAsync(onSuccess, onFailure);
          }

          function onSuccess() {
            console.log("Get Title: " + currentUser.get_title()); // Domain\Account
            console.log("Get Email: " + currentUser.get_email());
            console.log("Get Name: " + currentUser.get_loginName());
          }

          function onFailure() {
            console.log(
              "Request failed" +
                args.get_message() +
                "\n" +
                args.get_stackTrace()
            );
          }

          function exchangeTokenAsync(resourceUri) {
            let user = clientApplication.getAccount();
            if (user) {
              console.log("User exist" + user);
              let requestObj = {
                scopes: [resourceUri],
                login_hint: currentUser.get_title(),
              };
              console.log("RequestObj: " + JSON.stringify(requestObj));
              return clientApplication
                .acquireTokenSilent(requestObj)
                .then(function (tokenResponse) {
                  console.log(
                    "ExchangeTokenAsync requestObj: " +
                      tokenResponse.accessToken
                  );
                  return tokenResponse.accessToken;
                })
                .catch(function (error) {
                  console.log("ExchangeTokenAsync error: " + error);
                });
            } else {
              return Promise.resolve(null);
            }
          }
</script>

在日志中,我看到以下内容。

在 getCurrentUser 内部

获取标题:<--登录用户名-->

获取电子邮件:<--登录用户电子邮件 ID-->@<--org-name-->.com

获取名称:i:0#.f|membership|<--登录用户电子邮件ID-->@<--org-name-->.com

getOAuthCardResourceUri:api://fed35aaa-xxxx-yyyy-aae0-54a2573bbbbb/Canvas.PVA.SSO

KMT - 用户存在[对象对象]

requestObj: {"scopes":["api://fed35aaa-xxxx-yyyy-aae0-54a2573bbbbb/Canvas.PVA.SSO"],"login_hint":"<--登录用户名-->"}

exchangeTokenAsync requestObj: eyJ0eXAiOiJKV1QiL......令牌编号继续

错误 502 https://directline.botframework.com/v3/directline/conversations/9xbtVbIwi0D8O7T2da9GKP-f/activities

Error image

谁能帮我实现这个目标?提前致谢。

1 个答案:

答案 0 :(得分:0)

这是可以帮助您进行共享点 SSO 的 docrepo。支持用户登录和 SSO 的 OAuth 服务。以下是 S2S 和用户身份验证的示例。

Bot-authentication 演示了如何为用户身份验证流程集成 OAuth 提供程序。