theme: channing-cyan

highlight: a11y-dark

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

需求场景:

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

域账号 登录 mysql 域账号登录失败_数据库

1.实现思路

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

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

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

域登录静默流程:

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

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

域登录非静默流程:

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

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

2.相关代码

```js // 免输入账号密码,跳转到获取域账号页面 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) } }) } ```