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个地方都可以用,当然这个前提是保证你公司自己的服务器的数据库用的是同一套. 为保证用户数据的唯一性, ...
随机推荐
- Fluent Meshing分离边界层网格
源视频链接: https://pan.baidu.com/s/1SYB7UdRuXOGYXYwmxKADdw 提取码: h7qj
- 冰多多团队-第四次Scrum会议
冰多多团队-第四次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 zpj 撰写团队任务拆解博客 完成部分Action的实现 牛雅哲 完成了词典单词,词典映射的代码实现,设计了初步的词典异常 ...
- 如何查看android studio sdk路径配置
file–>Other Settings–>Default Project Structure
- 如何分析redis中的慢查询
慢查询的两个参数配置 慢查询只记录命令执行时间,并不包括命令排队和网络传输时间.因此客户端执行命令的时间会大于命令实际执行时间.因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求 ...
- Python - Django - 中间件 process_view
process_view 的执行顺序也是按照 settings.py 中的顺序来执行 process_view 在 urls.py 的对应关系之后,在执行视图函数之前执行 如果返回 None,则继续执 ...
- Python正则简单实例分析
Python正则简单实例分析 本文实例讲述了Python正则简单用法.分享给大家供大家参考,具体如下: 悄悄打入公司内部UED的一个Python爱好者小众群,前两天一位牛人发了条消息: 小的测试题: ...
- SonarQube + Jenkins代码审查环境安装文档 v1.2
1. 安装SonarQube 1.1. 下载 下载地址:https://www.sonarqube.org/downloads/ 本次使用安装包为:sonarqube-7.4.zip 需要提前准备jd ...
- [转]casperjs截图出现黑色背景
原文地址:https://my.oschina.net/tuxpy/blog/879509?utm_medium=referral 如果默认没有指定 body的background-color就会出现 ...
- Windows删除文件夹下的指定格式文件(递归删除)
问题描述: 今天遇到一个需求,需要对文件夹进行文件筛选.目录结构较为复杂(目录较多,层次较深),数据量较大(总共60GB左右). 鉴于上述情况,直接排除了人工处理方式(否则小伙伴们会打死我的). 解决 ...
- Zabbix 3.0 配置企业微信报警(配置zabbix-web)
一.添加报警媒体类型 Name:自定义 Type:选择script Scripts name:填写脚本名称 Script parameters:脚本参数 --corpid=XXX --corpsecr ...