钉钉(DingTalk)免登录
公司OA选择了钉钉(DingTalk)。
应实际需求,自己也有开发几款H5微应用,一些资料与数据为避免用户从微应用分享出去。只好为微应用添加免登录功能。
前期准备,在自己的本地数据库服务器中,创建用户表,关从钉钉先同步下来。《获取钉钉用户数据》
这是为后面实现免登录时,获取访问者的信息与本地数据库的用户信息对比,如果匹配存在,说明是企业人员,如果不匹配,即是非法者访问。
models:
应实际需求,自己也有开发几款H5微应用,一些资料与数据为避免用户从微应用分享出去。只好为微应用添加免登录功能。
前期准备,在自己的本地数据库服务器中,创建用户表,关从钉钉先同步下来。《获取钉钉用户数据》
这是为后面实现免登录时,获取访问者的信息与本地数据库的用户信息对比,如果匹配存在,说明是企业人员,如果不匹配,即是非法者访问。
models:

建立2个字段。
controller:
views:
引用js脚本,
<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.10.3/dingtalk.open.js"></script>
上面截图中,#29行代码,判断是否是在钉钉应用中访问。直接把地址粘贴至手机浏览器或电脑浏览器中,不好意思,它不允许访问。
#32行,这是从控制器使用ViewBag传过来的corpid。
正常情况之下,它可以获取临时的authCode。
这个时候,我们回到DingTalk控制器,根据获取authCode来获取用户信息。添加一个httppost方法 LoginByDingTalk,它返回类型JsonResult。
#32,#33行,2个Entity类,稍后分析说明。
#37行,获取userid。
#45行,把userid来去本地数据库(博文前面有提过,把钉钉企业内人员信息存在本地)查找此用户,存在与否。
#48行,验证成功后,让步程序导向免登录的页面。
再回到上上一张截图,第#47行js方法,
function exchangeAuthCodeForDingTalkUserData(authCode){...}
接着上面所留下的问题,看看DingDingEntity Entity类,
#20行,是获取AccessToken,此时会有网友会问,怎么需要使用到存储过程?因为Insus.NET有把AccessToken存储在本地数据库。只有过期了,才去从钉钉获取,再更新本地数据库中。
#39行,是从钉钉获取用户认信息,
API:
string url = $"https://oapi.dingtalk.com/user/getuserinfo?access_token={access_token}&code={code}";
传入accesstoken和authCode参数。
#47行代码,有一个自定义类,可以参考这篇来实现C#类,《MS SQL SERVER操作API的GET和POST CLR》
#35行,json反序列化用户信息,
然后去控制器中,把每个需要登录验证的ActionResult添加过滤器,如,
免登录程序功能实现,大约如此,仍有一此细节未分享出来,没有明白的,可以咨询Insus.NET.