3. ABP .NETCore 添加企业微信第三方登录
1.企业微信登录步骤
1.获取企业微信Token
官方文档:https://work.weixin.qq.com/api/doc#90000/90135/91039
2.通过Token 与前端传的Code 参数 调用微信API获取 访问用户身份
官方文档https://work.weixin.qq.com/api/doc#90000/90135/91023
3.通过获取的企业用户信息到自己的服务器进行查询,存在就登录成功,不存在则登录失败,前提是我们先要把企业微信的用户同步到自己的服务器。
2.下图是我们需要添加或修改的文件

3下面开始我们的代码:
1.先声明微信接口返回的实体
// 获取Token返回的实体
public class WeChatToken
{
public int errcode { get; set; }
public string errmsg { get; set; }
public string access_token { get; set; }
public int expires_in { get; set; }
}
public class WeChatUserInfo
{
public int errcode { get; set; }
public string errmsg { get; set; }
// 企业用户ID
public string UserId { get; set; }
// 非企业用户ID
public string OpenId { get; set; }
public string DeviceId { get; set; }
}
2.添加企业微信第三方登录
using Abp.UI;
using Newtonsoft.Json;
using System;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using TexHong_EMWX.Authentication.JwtBearer;
using TexHong_EMWX.Authorization;
using TexHong_EMWX.Authorization.Users;
using TexHong_EMWX.Models.WeChat;
using TexHong_EMWX.WXUsers; namespace TexHong_EMWX.Authentication.External
{
public class WechatMiniProgramAuthProviderApi : ExternalAuthProviderApiBase
{
/// 第三方登录名称需要与前端配置的一致
public const string ProviderName = "EnterpriseWechat";
private readonly UserManager _userManager;
/// 本地微信用户的服务。 这个需要自己添加。用于判断当前微信用户是否有权限
private readonly WXUserManager _wXUserManager;
private readonly LogInManager _logInManager;
private readonly TokenAuthConfiguration _configuration;
private readonly IExternalAuthConfiguration _externalAuthConfiguration;
public WechatMiniProgramAuthProviderApi(
UserManager _userManager,
WXUserManager _wXUserManager,
LogInManager _logInManager,
TokenAuthConfiguration _configuration,
IExternalAuthConfiguration _externalAuthConfiguration) {
this._userManager = _userManager;
this._wXUserManager = _wXUserManager;
this._logInManager = _logInManager;
this._configuration = _configuration;
this._externalAuthConfiguration = _externalAuthConfiguration;
}
public override async Task<ExternalAuthUserInfo> GetUserInfo(string Code)
{
// 1. 获取企业微信ToKen
WeChatToken weChatToken = await this.GetWechatToKen();
// 2. 获取用户信息
WeChatUserInfo weChatUserInfo = await this.GetWechatUserId(Code, weChatToken.access_token);
// 3. 通过获取的的微信用户UserId并判断是否存在自己的服务器中。
WXUser wXUser = await _wXUserManager.FindByUserId(weChatUserInfo.UserId);
var t = wXUser == null ? new ExternalAuthUserInfo() : new ExternalAuthUserInfo
{
EmailAddress = wXUser.Email,
Surname = wXUser.AbpUser.Surname,
ProviderKey = weChatUserInfo.UserId,
Provider = ProviderName,
Name = wXUser.AbpUser.Name
};
return t;
} public async Task<WeChatToken> GetWechatToKen() {
var Provider = _externalAuthConfiguration.Providers.FirstOrDefault(P => P.Name == ProviderName);
var appid = Provider.ClientId;
var secret = Provider.ClientSecret;
try
{
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
httpClient.Timeout = TimeSpan.FromMinutes();
var urlToken = $"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={appid}&corpsecret={secret}";
string ResultToken = await httpClient.GetStringAsync(urlToken);
WeChatToken wX_Token = JsonConvert.DeserializeObject<WeChatToken>(ResultToken);
return wX_Token;
}
catch (Exception ex)
{
throw new UserFriendlyException("获取微信access_token失败" + ex.Message);
}
} public async Task<WeChatUserInfo> GetWechatUserId(string code,string token) {
try
{
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
httpClient.Timeout = TimeSpan.FromMinutes();
var urlGetUserInfo = $"https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token={token}&code={code}";
var ResultUserInfo = await httpClient.GetStringAsync(urlGetUserInfo);
WeChatUserInfo wXUserInfo = JsonConvert.DeserializeObject<WeChatUserInfo>(ResultUserInfo);
return wXUserInfo;
}
catch (Exception ex)
{
throw new UserFriendlyException("获取微信UserInfo失败" + ex.Message);
}
}
}
}
3.修改配置文件 appsetttings.json

"EnterpriseWechat": {
"IsEnabled": "true",
"AppId": "",
"Secret": ""
}
4.注入第三方登录 在WebCoreModule.cs 中添加注入代码
public override void PreInitialize()
{
ConfigureExternalAuthProviders();
}
public void ConfigureExternalAuthProviders() {
IocManager.Register<ExternalLoginProviderInfo>();
IocManager.Register<IExternalAuthConfiguration,ExternalAuthConfiguration>();
var externalAuthConfiguration = IocManager.Resolve<ExternalAuthConfiguration>();
if (bool.Parse(_appConfiguration["Authentication:EnterpriseWechat:IsEnabled"]))
{
externalAuthConfiguration.Providers.Add(
new ExternalLoginProviderInfo(
WechatMiniProgramAuthProviderApi.ProviderName,
_appConfiguration["Authentication:EnterpriseWechat:AppId"],
_appConfiguration["Authentication:EnterpriseWechat:Secret"],
typeof(WechatMiniProgramAuthProviderApi)
)
);
}
}
5.接下来最后一步就是修改 ExternalAuthenticate 方法,因为里面的代码ABP默认就已经我们实现了一些东西,需要根据自己实际的需要进行修改。

发布下项目测试下自动登录吧。
3. ABP .NETCore 添加企业微信第三方登录的更多相关文章
- JustAuth 1.15.9 版发布,支持飞书、喜马拉雅、企业微信网页登录
新增 修复并正式启用 飞书 平台的第三方登录 AuthToken 类中新增 refreshTokenExpireIn 记录 refresh token 的有效期 PR 合并 Github #101:支 ...
- iOS微信第三方登录实现
iOS微信第三方登录实现 一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统.在进行微信OAuth2.0授权登录接入之前,在微信开 ...
- laravel5实现微信第三方登录功能
背景 最近手头一个项目需要实现用户在网站的第三方登录(微信和微博),后端框架laravel5.4. 实现过程以微信网页版第三方登录,其他于此类似,在此不做重复. 准备工作 网站应用微信登录是基于OAu ...
- 微信第三方登录(原生)demo
在一家ecstore二开公司有一段时间了,公司希望往自己研发产品上面走,一直在培养新人. 最近要自己去微信登录,自己就在ectore的框架基础上,写的原生微信第三方登录以此来熟悉微信第三方登录,在 ...
- 发现一个企业微信第三方应用开发的疑似BUG
1.企业微信两个账号A(超级管理员),账号B(分级管理员),账号B具有创建应用与小程序权限.2.账号B添加一个第三方应用后(创建后能看到第三方应用),使用下图接口登录时回调的agent一直为空,3.超 ...
- Android Learning:微信第三方登录
这两天,解决了微信第三方授权登录的问题,作为一个新手,想想也是一把辛酸泪.我想着,就把我的遇到的坑给大家分享一下,避免新手遇到我这样的问题能够顺利避开. 步骤一 微信开发者平台 我开始的解决思路是,去 ...
- Python Django对接企业微信第三方服务回调验证的一些坑
今天公司老总,叫我把公司的企业微信,服务商管理后台中的本地应用进行回调验证. 听起来一脸懵逼,没搞过企业微信对接情况.一头雾水,不知道如何下手. 先讲解一下,企业微信情况. 登录到企业微信后,右上角服 ...
- C# winform C/S WebBrowser 微信第三方登录
网上很多的资料都是B/S结构的,这里是基于C# C/S 结构的微信第三方授权登录 一.准备知识 1 http Get和Post方法.做第三方授权登录,获取信息基本上都是用get和post方法,做之前需 ...
- 微信公众号与APP微信第三方登录账号打通
一个项目同时开发了APP和微信服务号,需要做到APP和微信服务号的账号互通同步,也就是说一个账号在2个地方都可以用,当然这个前提是保证你公司自己的服务器的数据库用的是同一套. 为保证用户数据的唯一性, ...
随机推荐
- 浅谈UDF并行
首先我们来看说明UDF并行流程的这个图 网格和求解数据分布和储存在计算节点(compute-node)处理器上,而对于GUI界面和主机(host)节点上不存储任何数据,主机节点将命令从GUI传递到0节 ...
- 【小盘子看源码-MyBatis-1】MyBatis配置文件的加载流程
众所周知,Mybatis有一个全局的配置,在程序启动时会加载XML配置文件,将配置信息映射到org.apache.ibatis.session.Configuration类中,例如如下配置文件. &l ...
- python PIL 图像处理
python PIL 图像处理 This blog is from: https://www.jianshu.com/p/e8d058767dfa Image读出来的是PIL的类型,而skimage. ...
- spatiaLite
- HIVE-计算累计和
eg:统计1-12月的累积销量,即1月为1月份的值,2月为1.2月份值的和,3月为123月份的和,12月为1-12月份值的和 SELECT month,SUM(amount) month_amou ...
- c# 格式化时间
var dt = DateTime.Now; string tmp = string.Format("{0}{1}-{2:00}-{3:00}.*.{4}", "&quo ...
- 什么是依赖注入 IoC
设计原则:依赖注入原则 依赖倒置原则,是一种程序设计模式的原则 高层模块不应该依赖底层模块,二者都应该依赖其抽象. 抽象不应该依赖细节,细节应该依赖抽象.依赖导致原则很好的体现了“面向接口编程”的思想 ...
- Celery-管理与监控
1. 监控和管理Workers 1.1 将celery实例放入shell [root@node2 app]# celery -A tasks shell Python 3.6.5 (default, ...
- OCR(Optical Character Recognition)算法总结
https://zhuanlan.zhihu.com/p/84815144 最全OCR资料汇总,awesome-OCR
- [LeetCode] 734. Sentence Similarity 句子相似度
Given two sentences words1, words2 (each represented as an array of strings), and a list of similar ...