在网页中嵌入钉钉认证,如果不是在钉钉内打开网站,直接跳转到扫码页面,用手机钉钉完成扫码,交由后端获钉钉取用户uuid;如果是在钉钉内,直接在前端请求临时授权码,并根据临时授权码取得钉钉用户uuid。再根据uuid获取用户信息,,并跳转到首页。
在页面引入钉钉相关js文件:
<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.10.3/dingtalk.open.js"></script><script type="text/javascript" src="https://g.alicdn.com/dingding/dingtalk-pc-api/2.7.0/index.js"></script><script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>
构建扫码页面,在页面添加一个id=login_container的html标签,以便加载钉钉二维码;根据变量dd.env.platform可以判断是否在钉钉内,整体页面如下
@{Layout = null;}<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width" /><title>钉钉扫码登陆</title>@Styles.Render("~/Content/css")@Scripts.Render("~/bundles/modernizr")<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.10.3/dingtalk.open.js"></script><script type="text/javascript" src="https://g.alicdn.com/dingding/dingtalk-pc-api/2.7.0/index.js"></script><script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script></head><body><div class="container-fluid" style="width:100%;margin:0 auto;padding:0 0"><div class="text-center"><input type="hidden" id="reurl" value="@ViewData["ReUrl"]" /><div id="login_container"></div></div><div><iframe src="" id="autologin" hidden></iframe></div></div>@Scripts.Render("~/bundles/jquery")@Scripts.Render("~/bundles/bootstrap")@Scripts.Render("~/bundles/service")<script>function closePage() {var userAgent = navigator.userAgent;if (userAgent.indexOf("Firefox") != -1 || userAgent.indexOf("Chrome") != -1) {location.href = "about:blank";} else {window.opener = null;window.open('', '_self');}window.close();}var appid = "@GlobalRes.ServerRuntimeConfig.DDLoginAppId";var url = encodeURIComponent( '@GlobalRes.ServerRuntimeConfig.SiteLocaltion' + '/ddlogin/dologin?reurl='+$("#reurl").val());var goto = encodeURIComponent('https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=' + appid + '&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=' + url);if (dd.env.platform !== 'notInDingTalk') {dd.ready(function () {var flag = 0;dd.runtime.permission.requestAuthCode({corpId: "@GlobalRes.ServerRuntimeConfig.DDConfig.CorpId", // 企业idonSuccess: function (info) {$.ajax({url: '/tdl/DDLogin/DoLogin1?code=' + info.code + '&reurl=' + $("#reurl").val(), //+ '&corpid='+ _config.corpId,type: 'post',sync: false,success: function (data, status, xhr) {var msg = JSON.parse(data);if (msg.Code == "Sucess") {var reurl = $("#reurl").val();flag = 1;}else {flag = 0;closePage();alert(msg.Message);}},error: function (xhr, errorType, error) {logDDLoginAppIdDDLoginAppIder.e("yinyien:" + _config.corpId);alert(errorType + ', ' + error);flag = 0;//closePage();}});}});if (flag == 1) {var reurl = $("#reurl").val();if (reurl != "")top.location.href = reurl;elsetop.location.href = '/tdl/main/index';}})}else { //浏览器访问扫码登陆var obj = DDLogin({id: "login_container",//这里需要你在自己的页面定义一个HTML标签并设置id,例如<div id="login_container"></div>或<span id="login_container"></span>goto: goto,style: "border:none;background-color:#FFFFFF;",width: "365",height: "400"});var handleMessage = function (event) {var origin = event.origin;console.log("origin", event.origin);if (origin == "https://login.dingtalk.com") { //判断是否来自ddLogin扫码事件。var loginTmpCode = event.data;window.parent.postMessage(loginTmpCode, '*');var redirect_uri_check = "https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=dingoazjmclpvolnxq3wba&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=http://&loginTmpCode=";window.location.href = redirect_uri_check + loginTmpCode;}};if (typeof window.addEventListener != 'undefined') {window.addEventListener('message', handleMessage, false);} else if (typeof window.attachEvent != 'undefined') {window.attachEvent('onmessage', handleMessage);}}</script></body></html>
后端代码,钉钉扫码登陆逻辑
/// <summary>/// 扫码登陆/// </summary>public string DoLogin(string code, string state){string reurl = Request.Params["reurl"];DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");OapiSnsGetuserinfoBycodeRequest req = new OapiSnsGetuserinfoBycodeRequest();req.TmpAuthCode = code;OapiSnsGetuserinfoBycodeResponse response = client.Execute(req, GlobalRes.ServerRuntimeConfig.DDLoginAppId, GlobalRes.ServerRuntimeConfig.DDLoginAppSecret);if (response.Errcode == 0){dynamic msg = JsonConvert.DeserializeObject(response.Body);string unionid = msg.user_info.unionid;try{string token = GlobalRes.ServerRuntimeConfig.DDConfig.EApps[0].RequestToken();var userResponse = DDHelper.GetUserInfoByUnionid(token, unionid);if (userResponse.Errcode == 0){HttpCookie cookie = new HttpCookie("TDL");cookie["HasLogin"] = "1";cookie["DDUserId"] = userResponse.Userid;cookie["DDIsAdmin"] = userResponse.IsAdmin ? "1" : "0";cookie["DDUserInfo"] = userResponse.Body;cookie["Depts"] =JsonConvert.SerializeObject(userResponse.Department);Response.SetCookie(cookie);if (!string.IsNullOrEmpty(reurl))Response.Redirect(reurl);elseResponse.Redirect($"/inv/scrapsubmit/INDEX?HasLogin=1&DDUserId={userResponse.Userid}");}elsethrow new Exception(userResponse.Errmsg);}catch (Exception exp){Response.Write(exp.Message);Response.End();}}return response.Body;}
钉钉免登,后端处理逻辑
/// <summary>/// 钉钉微应用免登/// </summary>[HttpPost]public ActionResult DoLogin1(string code, string reurl){string token = GlobalRes.ServerRuntimeConfig.DDConfig.EApps[0].RequestToken();var client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();request.Code = code;request.SetHttpMethod("GET");Message<dynamic> msg = new Message<dynamic>();Logger.Info("钉钉免登");try{OapiUserGetuserinfoResponse response = client.Execute(request, token);if (response.Errcode == 0){OapiUserGetResponse userResponse = DDHelper.GetUserDetail(token, response.Userid);if (userResponse.Errcode == 0){HttpCookie cookie = new HttpCookie("TDL");cookie["HasLogin"] = "1";cookie["DDUserId"] = userResponse.Userid;cookie["DDIsAdmin"] = userResponse.IsAdmin ? "1" : "0";cookie["DDUserInfo"] = userResponse.Body;cookie["Depts"] = JsonConvert.SerializeObject(userResponse.Department);Response.SetCookie(cookie);msg.ReturnObject = userResponse;Logger.Info(cookie.Value);}elsethrow new Exception($"获取钉钉用户信息失败{ response.Errmsg } { response.ErrMsg}");}elsethrow new Exception($"登陆失败{ response.Errmsg } { response.ErrMsg}");}catch (Exception exp){Logger.Error(exp, "DoLogin1");return Json(JsonConvert.SerializeObject(Message<string>.SetFaultMsg(exp)), JsonRequestBehavior.AllowGet);}return Json(JsonConvert.SerializeObject(msg), JsonRequestBehavior.AllowGet);}
文章转载自不想做程序员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




