这是介绍使用ASP.NET CORE MVC 3.1 进行开发的第二篇文章,主要介绍免登流程
定义:“免登”是指用户进入应用后,无需输入钉钉用户名和密码,应用程序可自动获取当前用户身份,进而登录系统的流程。
常见应用场景:获取用户身份,发送工作消息;获取用户信息进行分组好管理;获取用户身份,进行表单的提交。包括某些访问的授权等。
使用以下代码获取免登授权码(调用此api不需要进行鉴权,即不需要进行dd.config)。获取的免登授权码有效期5分钟,且只能使用一次.
ps:这一段代码需要在钉钉的运行环境中才能生效,简单来说,需要进行真机调试,只是单纯的在网页中,打卡是无法获取到code的。前端接口调试环境详情:https://ding-doc.dingtalk.com/doc#/kn6zg7/qg4y64
dd.ready(function() {
dd.runtime.permission.requestAuthCode({
corpId: _config.corpId, // 企业id,创建应用时自动生成的,可登录开发者后台查看
onSuccess: function (info) {
code = info.code // 通过该免登授权码可以获取用户身份
}});
});
这一步将会的到一个字符串类型的免登授权码,得到以后需要向后端传送该code。
调试工具:在线调试
请求方式:GET(HTTPS)
请求地址:https://oapi.dingtalk.com/gettoken?appkey=key&appsecret=secret
参数说明:
参数 |
类型 |
必须 |
说明 |
appkey |
String |
是 |
应用的唯一标识key |
appsecret |
String |
是 |
应用的密钥 |
创建的应用以后,会得到appKey和appSecrect,假如没创建,请移步https://ding-doc.dingtalk.com/doc#/serverapi2/eev437。
获取access_token,需要在服务端进行,在.net core 中的使用具体如下:(注意注释部分)
public string GetAuthToken()
{
IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request = new OapiGettokenRequest();
//这里直接安装dingtalk .net core 版本的sdk会报错,可以将配置方法改成使用using
//Microsoft.Extensions.Configuration;并在appseting.json中配置即可
request.Appkey = Configuration["Appkey"];
request.Appsecret = Configuration["Appsecret"];
request.SetHttpMethod("GET");
OapiGettokenResponse response = client.Execute(request);
return response.AccessToken;
}
调试工具:在线调试
请求方式:GET(HTTPS)
请求地址:https://oapi.dingtalk.com/user/getuserinfo?access_token=access_token&code=code
参数说明:
参数 |
类型 |
必须 |
说明 |
access_token |
String |
是 |
调用接口凭证 |
code |
String |
是 |
免登授权码,参考上述“获取免登授权码” |
返回结果:
{
"userid": "****",
"sys_level": 1,
"errmsg": "ok",
"is_sys": true,
"errcode": 0
}
通过免登授权码和access_token获取用户的userid。免登授权码需要从钉钉运行环境下的前端获取。
前端代码可以参考如下,我这里使用了Jquery ajax.
dd.ready(function () {
// dd.ready参数为回调函数,在环境准备就绪时触发,jsapi的调用需要保证在该回调函数触发后调用,否则无效。
dd.runtime.permission.requestAuthCode({
corpId: _config.corpid,
onSuccess: function (result) {
//通过corpId,code获取userid,code为string类型
var code = result.code;
//alert(code)
$.ajax({
async: false,
type: 'get',
contentType: "application/json;charset=UTF-8",
datatype: "",
data: { "code": code },
//后端接收code获取userid的方法GetuserInfo
url: '/DingTalk/GetUserInfo',
success: function (ref) {
alert(ref),
},
})
},
onFail: function (err) {
alert(JSON.stringify(err));
}
});
服务的.net core 代码
//获取钉钉用户id
public string UserId;
public string GetUserInfo(string code)
{
IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
OapiUserGetuserinfoRequest req = new OapiUserGetuserinfoRequest();
//判断code是否为空,返回消息方便调试
if (string.IsNullOrEmpty(code))
{
return "空code";
}
req.Code = code;
req.SetHttpMethod("GET");
//判断token是否为空,返回消息方便调试
string token = GetAuthToken();
if (string.IsNullOrEmpty(token))
{
return "空token";
}
OapiUserGetuserinfoResponse rsp = client.Execute(req, token);
if (!string.IsNullOrEmpty(rsp.Userid))
{
UserId = rsp.Userid;
//所有参数不为空则调用发送信息方法,下次再讲解
SendWrokMsg(rsp.Userid);
}
return rsp.Body;
}
这里首先要保证,能够准确获取到code以及token。
假如前端报错,也就是执行了onFail: function (err) {}方法,报错信息如下:访问IP不在白名单之中。
当请求开放平台服务端接口遇到“访问IP不在白名单”问题时,表示您的请求IP不在该应用出口IP白名单内。
可以按照以下方式排查并修改:
(1)对比调用接口的应用中的AppKey值,与报错信息中返回的AppKey值是否一致。如果不一致,可能是由于AppKey或者AppSecret使用的是其他的,导致在获取AccessToken值时会提示错误。
注意:如果错误信息中返回的是CorpId值,说明创建应用时间较早,添加IP的路径为:登录开发者后台-基本信息-开发信息旧版-找到该应用使用的CorpSecret值,点击设置修改IP;如果当前账号按照上述路径查看不到CorpSecret,需要该企业主管理员账号查看并修改IP。
(2)如果应用中的AppKey值跟报错信息中返回的AppKey值是一致的,解决办法是将报错信息中的request IP添加到该应用的出口IP里面。
这个问题经常出现在当你用手机调试,并且你的笔记本连接手机WiFi时,就会出现这样的问题。
所有的代码都跑通时,在钉钉运行相应的页面时会弹出响应的具体信息。
真机调试如图:
本文主要介绍了在ASP.NET CORE 3.1平台下进行钉钉免登流程,下一次预计会讲消息通知啥的。。。