#需求场景

一个.net开发的web应用接入到企业微信的应用中,实现微信用户点击应用,打开web,获取到用户信息,并实现自动登录功能。

#参考

企业微信官方API文档:https://work.weixin.qq.com/api/doc/90000/90135/91020

#具体步骤

1、获取access_token

获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。

  • 请求方式: GET(HTTPS)

  • 请求地址: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET

    注:此处标注大写的单词ID和SECRET,为需要替换的变量,根据实际获取值更新。其它接口也采用相同的标注,不再说明。

  • 参数说明:

  • 权限说明:

    每个应用有独立的secret,获取到的access_token只能本应用使用,所以每个应用的access_token应该分开来获取

  • 返回结果:

{
"errcode": 0,
"errmsg": "ok",
"access_token": "accesstoken000001",
"expires_in": 7200
}

2、构造网页授权链接

如果企业需要在打开的网页里面携带用户的身份信息,第一步需要构造如下的链接来获取code参数:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

  • 参数说明:

员工点击后,页面将跳转至 redirect_uri?code=CODE&state=STATE,企业可根据code参数获得员工的userid。code长度最大为512字节。

  • 示例:

    假定当前企业CorpID:wxCorpId

    访问链接:http://www.wanwone.com?action=get

    根据URL规范,将上述参数分别进行UrlEncode,得到拼接的OAuth2链接为:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxCorpId&redirect_uri=http%3A%2F%2Fwww.wanwone.com%2Fcgi-bin%2Fquery%3Faction%3Dget&response_type=code&scope=snsapi_base&state=#wechat_redirect

注意,构造OAuth2链接中参数的redirect_uri是经过UrlEncode的

员工点击后,页面将跳转至

http://www.wanwone.com?action=get&code=AAAAAAgG333qs9EdaPbCAP1VaOrjuNkiAZHTWgaWsZQ&state=

企业可根据code参数调用获取员工的信息.

3、获取访问用户身份

该接口用于根据code获取成员信息

{
"errcode": 0,
"errmsg": "ok",
"UserId":"USERID",
"DeviceId":"DEVICEID"
}

b) 非企业成员授权时返回示例如下:

{
"errcode": 0,
"errmsg": "ok",
"OpenId":"OPENID",
"DeviceId":"DEVICEID"
}

#.Net具体代码

1、Web首页服务端代码

    protected void Page_Load(object sender, EventArgs e)
{
//获取配置信息(CorpId,Secret)
Dictionary<string, string> configs = GetConfig();
string access_token = Context.Cache["access_token"] as string;
if (!(Context.Request["code"] != null && Context.Request["state"] != null && Context.Request["state"].ToString() == "parasaga"))
{
if (access_token == null)
{
access_token = WXQYHelper.GetAccess_token(configs["CorpId"], configs["Secret"]);
//缓存到Cache
Context.Cache.Insert("access_token", access_token, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));
} if (string.IsNullOrEmpty(access_token))
{
//获取token失败
}
else
{
string service = Context.Request.Url.GetLeftPart(UriPartial.Path);
//构造网页授权链接
string redirectUrl = WXQYHelper.GetAuthLink(configs["CorpId"], service);
//重定向到授权链接
Context.Response.Redirect(redirectUrl);
}
}
else
{
string code = Context.Request["code"].ToString();
//根据code获取访问用户身份
string uid = WXQYHelper.GetUserIdByCode(access_token, code);
if (string.IsNullOrEmpty(uid))
{
//获取失败
}
else
{
//获取成功
//进行应用本身的登录逻辑
}
}
}
public Dictionary<string, string> GetConfig()
{
Dictionary<string, string> configs = new Dictionary<string, string>(); string CorpId = System.Configuration.ConfigurationManager.AppSettings["CorpId"].ToString();
string Secret = System.Configuration.ConfigurationManager.AppSettings["Secret"].ToString();
configs.Add("CorpId", CorpId);
configs.Add("Secret", Secret);
return configs;
}

2、帮助类代码

    public class WXQYHelper
{
/// <summary>
/// 获取登陆标识access_token
/// </summary>
/// <returns></returns>
public static string GetAccess_token(string corpId,string secret)
{
string result = "";
try
{
//https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
string tokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
var getStr = "corpid=" + corpId + "&corpsecret=" + secret;
result = Common.HttpWebRequest(tokenUrl, getStr, "GET");
}
catch (Exception e)
{
//PsLog.Error("获取登陆标识失败,返回结果:" + e.ToString());
return "";
}
//{
// "errcode": 0,
// "errmsg": "ok",
// "access_token": "accesstoken000001",
// "expires_in": 7200
//}
var jsonObj = (JObject)JsonConvert.DeserializeObject(result); var token = jsonObj["access_token"].ToString();
if (!string.IsNullOrEmpty(token))
{
return token;
}
else
{
return "";
}
}
/// <summary>
/// 构造网页授权链接
/// </summary>
/// <param name="corpId"></param>
/// <param name="appUrl"></param>
/// <returns></returns>
public static string GetAuthLink(string corpId,string appUrl)
{
string link = "";
//https://open.weixin.qq.com/connect/oauth2/authorize
//?appid=wxCorpId
//&redirect_uri=http%3a%2f%2fapi.3dept.com%2fcgi-bin%2fquery%3faction%3dget
//&response_type=code
//&scope=snsapi_base
//&state=#wechat_redirect
link = string.Format("{0}?appid={1}&redirect_uri={2}&response_type={3}&scope={4}&state={5}#wechat_redirect",
"https://open.weixin.qq.com/connect/oauth2/authorize",
corpId,
HttpUtility.UrlEncode(appUrl),
"code",
"snsapi_base",
"parasaga"
);
return link;
}
/// <summary>
/// 获取访问用户身份
/// </summary>
/// <param name="accessToken"></param>
/// <param name="code"></param>
/// <returns></returns>
public static string GetUserIdByCode(string accessToken, string code)
{
//https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE string result = "";
try
{
//https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
string tokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo";
var getStr = "access_token=" + accessToken + "&code=" + code;
result = Common.HttpWebRequest(tokenUrl, getStr, "GET");
}
catch (Exception e)
{
//PsLog.Error("获取userid失败,返回结果:" + e.ToString());
return "";
}
//{
// "errcode": 0,
// "errmsg": "ok",
// "UserId":"USERID",
// "DeviceId":"DEVICEID"
//}
var jsonObj = (JObject)JsonConvert.DeserializeObject(result); var uid = jsonObj["UserId"].ToString();
if (!string.IsNullOrEmpty(uid))
{
return uid;
}
else
{
return "";
}
}
}

ASP.NET实现企业微信接入应用实现身份认证的更多相关文章

  1. 如何在ASP.NET Core中实现一个基础的身份认证

    注:本文提到的代码示例下载地址> How to achieve a basic authorization in ASP.NET Core 如何在ASP.NET Core中实现一个基础的身份认证 ...

  2. [转]如何在ASP.NET Core中实现一个基础的身份认证

    本文转自:http://www.cnblogs.com/onecodeonescript/p/6015512.html 注:本文提到的代码示例下载地址> How to achieve a bas ...

  3. asp.net mvc 5 微信接入VB版 - 接入认证

    微信接入官方文档是php的,网上被抄好几遍的代码是c#的,就是没vb的.今天我把这个坑填了,做vb版的接入认证. 首先是照着开发文档把微信接入的模型写好.在Models文件夹新建一个Model Pub ...

  4. asp.net mvc 5 微信接入VB版 - 获取AccessToken

    获取AccessToken是微信接入的又一个基础操作.很多微信接口需要这个2小时一刷新的AccessToken作为参数. 转载请说明作者Nukepayload2 首先根据开发文档把获取AccessTo ...

  5. Asp.Net Core 企业微信静默授权

    企业微信接口文档 1.构造授权网页链接 2.回调获取到 Code 通过code+access_token去请求用户信息 3.获取access_token 调试准备工作 -->内网穿透+域名 推荐 ...

  6. 在 ASP.NET Core 应用中使用 Cookie 进行身份认证

    Overview 身份认证是网站最基本的功能,最近因为业务部门的一个需求,需要对一个已经存在很久的小工具网站进行改造,因为在逐步的将一些离散的系统迁移至 .NET Core,所以趁这个机会将这个老的 ...

  7. ASP.NET Web API教程(六) 安全与身份认证

    在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...

  8. 企业微信的corpsecret在哪里?

      问题: 查看“企业微信”的官方开发文档,在“获取access_token”部分提到,使用GET请求方法,访问 https://qyapi.weixin.qq.com/cgi-bin/gettoke ...

  9. 细说ASP.NET Forms身份认证

    阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...

随机推荐

  1. Go | Go 语言打包静态文件以及如何与Gin一起使用Go-bindata

    系列文章目录 第一章 Go 语言打包静态文件以及如何与Gin一起使用Go-bindata 目录 系列文章目录 前言 一.go-bindata是什么? 二.使用步骤 1. 安装 2. 使用 3. 读取文 ...

  2. Windows server 2008 搭建DNS服务

    现在用Windows搭建DNS的已经很少了,感觉也只有一些公司的某块部分能用上,最近在捣鼓这个,索性直接写下来,以后可以看了直接用. 开始: ★★★配置静态IP地址 老样子,有关服务器功能的建立,都是 ...

  3. C++中的快读和快写

    快读原理 单个字符的读入速度要比读入数字快,因此我们以字符的形式先读入,然后处理计算转为数字. 代码 inline int read(){ register int x = 0, t = 1; reg ...

  4. 【Pod Terminating原因追踪系列之一】containerd中被漏掉的runc错误信息

    前一段时间发现有一些containerd集群出现了Pod卡在Terminating的问题,经过一系列的排查发现是containerd对底层异常处理的问题.最后虽然通过一个短小的PR修复了这个bug,但 ...

  5. e3mall商城的归纳总结1之项目的架构

    首先来谈谈e3mall商城,e3mall商城是黑马推出一个学习的项目,前身是淘淘商城.两个用的技术差不多.,但由于后期加了一些新技术,更名为e3mall商城.本商城为分布式商城,主要用到的技术使mav ...

  6. 浅谈 FTP、FTPS 与 SFTP

    无论是网盘还是云存储,上传都是一项很简单的操作.那些便捷好用的上传整理工具所用的 FTP 协议到底是什么意义,繁杂的模式又有何区别? 二狗子最近搭建了一个图片分享网站,每天都有好多人在他的网站上传许多 ...

  7. 用Python写一个随机数字生成代码,5行代码超简单

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 第一步,安装 random 库 random库是使用随机数的Python标准库 ...

  8. 剑指 Offer 46. 把数字翻译成字符串

    题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,25 ...

  9. Agumaster添加股票日交易爬虫画面

  10. 2020年1月31日 安装Python的BeautifulSoap库记录

    C:\Users\ufo>pip install beautifulsoup4 Collecting beautifulsoup4 WARNING: Retrying (Retry(total= ...