注销未清除使用oidc客户端和身份服务器4

时间:2020-06-26 17:29:03

标签: single-page-application identityserver4 office-js oidc-client

我们正在使用Office.context.ui.displayDialogAsync通过OAUTH库(Oidc客户端)进行身份验证,以下是发现的结果。请帮忙。

  1. 根据附加的代码,我们能够在taskpane.ts文件中以messageHandler中的args的形式获取访问令牌...
  2. 但是当我登录新的浏览器时,只有安全令牌服务(STS)登录窗口打开。
  3. 如果我注销并清除了访问令牌,然后再次尝试登录时直接以登录用户身份登录,而无需打开安全令牌服务(STS)窗口。
  4. 一旦我清除了浏览器缓存,然后所有我只能再次获得“安全令牌服务(STS)”窗口。我们需要什么吗?

当前方案

displayDialogAsync首次作为STS登录打开,并且能够成功登录。但是,对于随后的登录,它不会弹出并直接用令牌加载数据。

预期方案

displayDialogAsync不仅应该在第一次登录时打开,而且应该在以后的登录时打开,这意味着如果用户注销并在该时间再次尝试登录,它也会弹出。是否需要清除displayDialogAsync的缓存?请帮助。

身份验证

Office.initialize = function () {

    var settings = {
      authority: "https://xxxxxx.com/xxxx/xx",      
      client_id: "https://xxxxxxx.com/",
      redirect_uri: "https://localhost:3000/taskpane.html",
      // silent_redirect_uri:"https://localhost:3000/taskpane.html", 
      post_logout_redirect_uri: "https://xxxxxxx.com/",       
      response_type: "id_token token",
      scope: "openid read:xxxx read:xxxxxx read:xxxxxxx",
      state: true,
      clearHashAfterLogin: false,
      filterProtocolClaims: true,  
      loadUserInfo: true,
      nonce:true,       
    };
    Oidc.Log.logger = console;
    var mgr = new Oidc.UserManager(settings); 
    mgr.signinRedirect();
    mgr.signinRedirectCallback().then((user) => {       
      if (user) {
        console.log(user);

      } else {
        mgr.signinPopupCallback().then(function (user) {
          window.location.href = '../';
        }).catch(function (err) {
          console.log(err);
        });
        throw new Error('user is not logged in');
      }
    });    
  };

taskpane.ts

const loginpopup = function () {
      if (OfficeHelpers.Authenticator.isAuthDialog())
        return;     
      Office.context.ui.displayDialogAsync(
        url,
        { height: 60, width: 60, /*displayInIframe:true*/ },
        dialogCallback);
      function dialogCallback(asyncResult) {
        if (asyncResult.status == "failed") {
         
          switch (asyncResult.error.code) {
            case 12004:
              console.log("Domain is not trusted");
              break;
            case 12005:
              console.log("HTTPS is required");
              break;
            case 12007:
              console.log("A dialog is already opened.");
              break;
            default:
              console.log(asyncResult.error.message);
              break;
          }
        }
        else {
          dialog = asyncResult.value; 
          dialog.addEventHandler(Office.EventType.DialogMessageReceived, messageHandler);
        }
      }
      function messageHandler(arg: any) {
        if (arg != "jsonMessage") {
          $(".loader").show();
          var test = JSON.parse(arg.message).value.split("#")[1].split("&")[1].split("=");         
          dialog.close();
        };
      }
}

logout.ts

Office.initialize = () => {

  var settings = {    
    authority: "https://xxxxxx.com/xxxxxx/v1",     
    client_id: "https://xxxxxxx.com/",
    redirect_uri: "https://localhost:3000/logout.html",    
    post_logout_redirect_uri: "https://localhost:3000/logout.html", 
    metadata: {        
      issuer: 'https://xxxxxx.com/xxxxxx/v1',  
      authorization_endpoint:  "https://xxxxxx.com/xxxxxxx/v1/xxxxx"      
  }    
  };  
  var mgr = new Oidc.UserManager(settings);   
  mgr.signoutRedirect();
  mgr.removeUser();
  mgr.revokeAccessToken();
  mgr.clearStaleState();
  $("document").ready(function () {    
  localStorage.removeItem('accessToken');  
  localStorage.clear();
  });  

0 个答案:

没有答案