#需求场景

一个.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. 给你的Swagger文档换套附魔皮肤吧

    前言 相信无论是前端或是后端的程序员对Swagger都不怎么陌生,没有用过应该也听说过 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 简 ...

  2. Java面试题(Java Web篇)

    Java Web 64.jsp 和 servlet 有什么区别? jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将 ...

  3. mysql 8.0.19 win10快速安装教程

    本文教程为大家分享了mysql 8.0.19安装教程,供大家参考,具体内容如下 1.下载.zip安装文件 2.根目录存放my.ini,文件路径用“/”分割,例如: [mysqld] port=3306 ...

  4. 23种设计模式 - 状态变化(Memento备忘录 - State)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 状态变化 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的 ...

  5. Framework项目持续集成(jenkins)及集合SonarQube

    目录 Framework项目持续集成及集合SonarQube - 前言 CI/CD是什么 -- jenkins 什么是sonarqube?什么是CodeReview? 什么是sonarqube? 什么 ...

  6. C++从LPEXCEPTION_POINTERS获取调用堆栈

    #pragma once #include <map> #include <vector> struct FunctionCall { DWORD64 Address; std ...

  7. WordCount(Java实现)

    Github项目地址:https://github.com/linzworld/word-count 项目相关要求 题目描述 Word Count 实现一个简单而完整的软件工具(源程序特征统计程序). ...

  8. 微信小程序(1)

    微信小程序 什么是微信小程序? 微信小程序优点 跨平台 打开速度比h5快 不用下载 开发目录结构介绍 1. 小程序Pages目录说明 2. 工具文件夹 3. 全局文件 用法1 全局APP.json文件 ...

  9. agumaster增加了网易数据源

  10. Native Comments

    local variables referenced from a Lambda expression must be final or effectively final. Lambda表达式中引用 ...