#需求场景

一个.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. 获取元素top值,屏幕滚动到当前元素

    var top = $(this).offset().top; $('html , body').animate({scrollTop: top-100},10);

  2. (转载)std::enable_if 的几种用法 c++11

    今天看confluo源码中看到了std::enable_if这一个我不了解的语法,所以记录下来 转载地址:https://yixinglu.gitlab.io/enable_if.html std:: ...

  3. packmol建模流程-计算

    一.建模流程(modelling procedure): 1.美国数据库下载amc.cif文件:http://rruff.geo.arizona.edu/AMS/amcsd.php 2.导入vesta ...

  4. Java二进制和位运算,这一万字准能喂饱你

    基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...

  5. EventLoop-浏览器篇2

    最近又碰到了event loop问题,之前研究的实在是浅显(https://www.cnblogs.com/zx0423/p/12641637.html)所以今天主要讲述promise的链式调用,as ...

  6. go微服务系列(四) - http api中引入protobuf

    1. protobuf相关依赖安装 2. 改造之前的client 2.1 新建proto文件 2.2 运行protoc命令生成go文件 2.3 然后把原来的map修改成具体的类型就可以了 3. 处理j ...

  7. 快醒醒,C# 9 中又来了一堆关键词 init,record,with

    一:背景 1. 讲故事 .NET5 终于在 2020-08-25 也就是前天发布了第八个预览版,这么多的预览版搞得我都麻木了,接踵而来的就是更多的新特性加入到了 C# 9 中,既然还想呆在这条船上,得 ...

  8. 归纳从文件中读取数据的六种方法-JAVA IO基础总结第2篇

    在上一篇文章中,我为大家介绍了<5种创建文件并写入文件数据的方法>,本节我们为大家来介绍6种从文件中读取数据的方法. 另外为了方便大家理解,我为这一篇文章录制了对应的视频:总结java从文 ...

  9. 常用API【2】

    常用API 1.Math类 1.1 Math类概述 Math包含执行基本数字运算的方法 没有构造方法,如何使用类中的成员呢? 看类的成员是否是静态的,如果是,可以通过类名直接调用 1.2Math类的常 ...

  10. Zabbix 5.0 LTS版本的安装小结

    Zabbix 5.0 LTS版本的安装小结   1:准备Zabbix的服务器. 这里可能需要一台或多台服务器,视需求和资源而定.也可以将Zabbix_Server.MySQL.Zabbix Web等安 ...