官方文档:鉴权
由于官方文档没有C#的,所以自己弄了个C#的

需要注意的是,不是所有功能都需要鉴权,但是在需要鉴权的地方,一定要有

-第一步:获得access_token
我使用的是企业内部应用
具体代码:

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["AppParameter:Appkey"];request.Appsecret = Configuration["AppParameter:Appsecret"];request.SetHttpMethod("GET");OapiGettokenResponse response = client.Execute(request);return response.AccessToken;}

代码里面的Configuration是注入进去的,为了读取写入配置文件的数据,即一些固定的数据,比如key,CorpId等等
代码:

 private readonly IConfiguration Configuration;public MyTestService(IConfiguration Configuration){this.Configuration = Configuration;}

-第二步,获取jsapi_ticket

  • 企业内部应用和第三方企业应用获取jsapi_ticket后,当jsapi_ticket未过期时,再次调用get_jsapi_ticket接口获取到的jsapi_ticket和老的jsapi_ticket值相同,只是过期时间续期2小时。
  • 企业内部应用获取jsapi_ticket,一个appKey对应一个jsapi_ticket,所以在使用的时候需要将jsapi_ticket以appKey为维度进行缓存下来(设置缓存过期时间2小时),并不需要每次都通过接口拉取

代码:

public string GetTicket(string access_token){IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/get_jsapi_ticket");OapiGetJsapiTicketRequest req = new OapiGetJsapiTicketRequest();req.SetHttpMethod("GET");OapiGetJsapiTicketResponse rsp = client.Execute(req, access_token);return rsp.Ticket;}

-第三步:获取签名参数

//获取当前时间的时间戳public static string ConvertDateTimeToInt(){TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);return Convert.ToInt64(ts.TotalSeconds).ToString();}//获取签名/** 生成签名的函数* params:*   ticket:签名数据*    nonceStr:签名用的随机字符串,从properties文件中读取*     timeStamp:生成签名用的时间戳*    url:当前请求的URL地址*/public string GetSign(string ticket, string noncestr, string timeStamp, string url){string plain = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "&timestamp=" + timeStamp.ToString()+ "&url=" + url;SHA256 sha;ASCIIEncoding enc;string hash = "";try{sha = new SHA256CryptoServiceProvider();enc = new ASCIIEncoding();byte[] dataToHash = enc.GetBytes(plain);byte[] dataHashed = sha.ComputeHash(dataToHash);hash = BitConverter.ToString(dataHashed).Replace("-", "");hash = hash.ToLower();}catch (Exception){return "错误";}var signature = hash;return signature;}

-第四步:创建_config的计算函数

 /** 将所有需要传送到前端的参数进行打包,在前端会调用jsapi提供的dd.config接口进行签名的验证*params:*  request:在钉钉中点击微应用图标跳转的url地址*return:*    将需要的参数打包好,按json格式打包*/public string GetConfig(){string nonceStr = Configuration["AppParameter:NonceStr"]; //固定任意字符串string agentId = Configuration["AppParameter:AgentId"];  //agentid参数string timeStamp = ConvertDateTimeToInt();               //时间戳参数string accessToken = null;                               //token参数string ticket = null;                                    //ticket参数string signature = null;                               //签名参数string corpId = Configuration["AppParameter:CorpId"];    //CorpId参数string signedUrl = Configuration["AppParameter:Url"];    //页面网址try{accessToken = GetAuthToken();ticket = GetTicket(accessToken);signature = GetSign(ticket, nonceStr, timeStamp, signedUrl);}catch (Exception e){Console.WriteLine(e.ToString());}  var informationJson = new{jsticket = ticket,signature = signature,nonceStr = nonceStr,timeStamp = timeStamp,corpId = corpId,agentId = agentId,};return JsonSerializer.Serialize(informationJson);}

-第五步,在前端调用此方法得到_config,我使用的是ajax的方式进行前后端交互

var _config;$.ajax({async: false,type: 'get',contentType: "",datatype: "",data: {},//为_config配值url: '/home/GetConfig2',success: function (ref) {_config = eval('(' + ref + ')');//去掉json格式外面的双引号},});

-第六步,前端进行鉴权
代码:

dd.config({agentId: _config.agentId, // 必填,微应用IDcorpId: _config.corpId,//必填,企业IDtimeStamp: _config.timeStamp, // 必填,生成签名的时间戳nonceStr: _config.nonceStr, // 必填,自定义固定字符串。signature: _config.signature, // 必填,签名type: 0,   //选填。0表示微应用的jsapi,1表示服务窗的jsapi;不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持jsApiList: ['runtime.info','biz.contact.choose','device.notification.confirm','device.notification.alert','device.notification.prompt','biz.ding.post','biz.util.openLink','biz.cspace.saveFile','biz.cspace.preview','biz.cspace.chooseSpaceDir','biz.util.uploadAttachment'] // 必填,需要使用的jsapi列表,注意:不要带dd。});dd.error(function (err) {alert('dd error: ' + JSON.stringify(err));})//该方法必须带上,用来捕获鉴权出现的异常信息,否则不方便排查出现的问题

这里首先要保证,能够准确获取到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.netcore MVC钉钉H5微应用(二)鉴权相关推荐

  1. ASP.netcore MVC钉钉H5微应用(一)准备工作

    本文是我在做ASP.netcore MVC钉钉H5微应用的第一章,准备工作 首先,进入钉钉开发平台,需要自己在钉钉上创建一个工作室,然后申请成为开发者,并创建一个H5微应用 在H5微应用里填写需要的信 ...

  2. Asp.NetCore MVC Web 应用

    Asp.NetCore MVC 与 普通的MVC 基本一致, 只是代码结构稍有改动 一.创建项目 1. 2. 3. 项目结构 二. 构建数据模型 1. Startup类中配置EF Core MySql ...

  3. 详解比springSecurity和shiro更简单优雅的轻量级Sa-Token框架,比如登录认证,权限认证,单点登录,OAuth2.0,分布式Session会话,微服务网关鉴权

    文章目录 1. 技术选型 2. Sa-Token概述 2.1 简单介绍 2.2 登录认证 2.3 权限认证 3. 功能一览 4. Sa-Token使用 4.1 引入Sa-Token依赖 4.2 Sa- ...

  4. 微服务网关鉴权——gateway使用、网关限流使用、用户密码加密、JWT鉴权

    文章目录 微服务网关鉴权 课程目标 1.微服务网关Gateway 1.1 微服务网关概述 1.2 微服务网关微服务搭建 1.3 微服务网关跨域 1.4 微服务网关过滤器 2 网关限流 2.1 思路分析 ...

  5. 钉钉开发H5微应用获取code免登录

    一.在html页面引入钉钉的js <script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.10.3/dingtalk.o ...

  6. ASP.NET Core 项目简单实现身份验证及鉴权

    环境 VS 2017 ASP.NET Core 2.2 目标 以相对简单优雅的方式实现用户身份验证和鉴权,解决以下两个问题: 无状态的身份验证服务,使用请求头附加访问令牌,几乎适用于手机.网页.桌面应 ...

  7. Kong 优雅实现微服务网关鉴权,登录场景落地实战篇

    目录 登录实现 B 端登录之后,浏览器存 cookie 登录代码实现细节,cookie设计 网关介绍 API 网关是什么 为什么需要网关 从技术角度来看,什么是Kong? 为什么使用 Kong Kon ...

  8. 微服务网关鉴权:gateway使用、网关限流使用、用户密码加密、JWT鉴权

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...

  9. 微服务网关鉴权:gateway使用、网关限流使用 用户密码加密 JWT鉴权

    目标 掌握微服务网关Gateway的系统搭建 掌握网关限流的实现 能够使用BCrypt实现对密码的加密与验证 了解加密算法 能够使用JWT实现微服务鉴权 1.微服务网关Gateway 1.1 微服务网 ...

最新文章

  1. JS控制图片显示的大小(图片等比例缩放)
  2. ONNX+TensorRT
  3. 浅析网站优化知识自学从哪些方面开始起步
  4. ubuntu linux root,Ubuntu 中的 root 用户:你应该知道的重要事情 | Linux 中国
  5. Visual Studio 2017发布会:黄金时代的家族聚会
  6. 无类别地址CIDR概述
  7. 服务间的通信 RestTemplate和Feign
  8. php容器原理,容器与依赖注入的原理
  9. 31. Next Permutation (java 字典序生成下一个排列)
  10. 如何在window和mac共用一个移动硬盘
  11. 人生三重界---看山不是山,看水不是水
  12. 研读:OASIS:On Achieving a Sanctuary for Integrity and Secrecy on Untrusted Platforms
  13. Consul 踩坑日记,节点id冲突
  14. WPS怎么在线转换成Word,WPS转换成Word的操作步骤
  15. 2020移动apn接入点哪个快_移动水上乐园里的充气水池和支架水池,哪个回本快?...
  16. 无线传感器网络路由协议AODV(Ad hoc on-demand distance vector routing)
  17. 四轮转向系统横摆角速度控制simulink仿真模型,利用滑模控制算法,基于八自由度车辆模型
  18. 用了这个,我追到了自己的女神:Mac版QQ半自动发送情话
  19. 人工智能(网络爬虫)
  20. 云媒易:保健品行业怎么做软文推广?

热门文章

  1. 宁夏大学数学与计算机学院,毕利-宁夏大学信息工程学院
  2. ensp查看历史配置命令_eNSP常用命令.doc
  3. WEB浏览器兼容(转)
  4. python学习笔记011——内置函数__module__、__name__
  5. saltstack之(十二)配置管理mount
  6. 顶尖CSS Web设计师Andy Clarke访谈
  7. WinInet, WinHttp, Winsock, ws2_32的基本解释
  8. 如何才能识别市场趋势?[转]
  9. 您知道为何要采用固定的迭代周期吗
  10. 亿级用户中心的设计与实践