域账号登录:使用操作系统的用户账号免输入式登录业务系统

1,785 阅读3分钟

域账号登录:使用操作系统的用户账号免输入式登录业务系统

需求场景:

用户希望直接使用登录操作系统的账号进行业务系统的登录,从而实现操作系统账号和业务系统账号的绑定,且在各个业务系统中不需要输入账号密码的操作。

image.png

1.实现思路

域账号:这是一种通过在window操作系统上设置域集群,加入域组,从而获取在该域组的账号密码,该套账号密码可以用于登录操作系统。

域登录:我们通过中转的服务(例如.net)服务,获取操作系统的当前账号(即域账号),并用该账号来实现域登录(AD域),这样做的好处是在域组内,可以实现静默登录,不用输入账号密码,系统后台逻辑直接获取域账号进行登陆验证。

注意:域登录相关接口,在一些浏览器(ie11)上,可能只能使用域名(AD域名,不是备案那个域名),进行交互。所以可以分开使用,普通服务使用常规域名,和域登录相关使用AD域名。

域登录静默流程:

1.在登录页调用域登录静默登录接口(或链接),调用成功后域登录服务会回调到一个指定的页面地址,并返回域账号,该地址后面可以放置域账号。

2.回调到指定页面(这里是登录页),使用域账号作为参数调用约定的登录接口(调用登录接口是为了获取token等个人权限账号等信息,这里需要注意域账号必须在系统中注册有,否则无法调用原本的登录接口),进行免交互的静默登录。这种静默登录似乎只能在ie上实现,chrome不行。

域登录非静默流程:

1.在登录页调用域登录非静默接口(post异步接口),和普通的登录一样,需要先手动输入域账号密码,然后调用域登录非静默接口。

2.登录成功后,该异步接口会返回约定的信息,例如加密后的域账号,然后使用域账号作为参数调用约定的登录接口(调用登录接口是为了获取token等个人权限账号等信息,这里需要注意域账号必须在系统中注册有,否则无法调用原本的登录接口)。

2.相关代码

// 免输入账号密码,跳转到获取域账号页面
preLoginFree () {
  // 经注销功能退出到登录页,不进行预登陆
  if (this.$route.query.tag && this.$route.query.tag === 'logout') return

  // 经获取操作系统用户账号重定向到登录页,进行账号校验
  if (this.$route.query.sign) {
    let username = this.$route.query.sign
    if (!username) return
    username = window.atob(username)
    const params = {
      password: this.$common.encrypt(username),
      username: username
    }
    this.$api.path.freeLogin(params).then(res => {
      if (res.code === 0) {
        this.setInfo(res)
      }
    })
    return
  }

  // 跳转到ADLogin获取操作系统用户账号
  // 避免死循环,当前页面是ADLogin回调页面则不再跳转
  let flag = 'false'
  flag = window.location.href.indexOf('ADLogin') > -1 ? 'true' : 'false'
  if (flag === 'true') return

  // flag = sessionStorage.getItem('ADLin')
  // if (flag === 'true') return
  // sessionStorage.setItem('ADLin', 'true')

  // 使用指定域名,访问域账号相关服务
  generateConfig(val => {
    let href = window.location.protocol + '//' + window.location.host
    if (val.host === 'http://10.1.1.94') {
      href = 'http://km'
    }
    if (val.host === 'http://10.1.1.61') {
      href = 'http://km-test'
    }

    window.location.href = href + '/ADLogin'
    if (this.$common.getBrowser() === 'IE') {
      // window.location.reload()
    }
  })
},
// 获取操作系统用户账号,用于域账号登陆
preLogin () {
  const params = {
    pass: this.$common.encrypt(this.password),
    name: this.username
  }
  // path.preLogin,是一个域登录服务(.net)的post接口
  this.$api.path.preLogin(params).then(res => {
    if (res.code === 0) {
      this.freeLogin(res)
    }
  })
},
// 使用域账号登录
freeLogin () {
  const params = {
    password: this.$common.encrypt(this.username),
    username: this.username
  }
  this.$api.path.freeLogin(params).then(res => {
    if (res.code === 0) {
      this.setInfo(res)
    }
  })
}