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 添加企业微信第三方登录的更多相关文章

  1. JustAuth 1.15.9 版发布,支持飞书、喜马拉雅、企业微信网页登录

    新增 修复并正式启用 飞书 平台的第三方登录 AuthToken 类中新增 refreshTokenExpireIn 记录 refresh token 的有效期 PR 合并 Github #101:支 ...

  2. iOS微信第三方登录实现

    iOS微信第三方登录实现   一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统.在进行微信OAuth2.0授权登录接入之前,在微信开 ...

  3. laravel5实现微信第三方登录功能

    背景 最近手头一个项目需要实现用户在网站的第三方登录(微信和微博),后端框架laravel5.4. 实现过程以微信网页版第三方登录,其他于此类似,在此不做重复. 准备工作 网站应用微信登录是基于OAu ...

  4. 微信第三方登录(原生)demo

    在一家ecstore二开公司有一段时间了,公司希望往自己研发产品上面走,一直在培养新人.   最近要自己去微信登录,自己就在ectore的框架基础上,写的原生微信第三方登录以此来熟悉微信第三方登录,在 ...

  5. 发现一个企业微信第三方应用开发的疑似BUG

    1.企业微信两个账号A(超级管理员),账号B(分级管理员),账号B具有创建应用与小程序权限.2.账号B添加一个第三方应用后(创建后能看到第三方应用),使用下图接口登录时回调的agent一直为空,3.超 ...

  6. Android Learning:微信第三方登录

    这两天,解决了微信第三方授权登录的问题,作为一个新手,想想也是一把辛酸泪.我想着,就把我的遇到的坑给大家分享一下,避免新手遇到我这样的问题能够顺利避开. 步骤一 微信开发者平台 我开始的解决思路是,去 ...

  7. Python Django对接企业微信第三方服务回调验证的一些坑

    今天公司老总,叫我把公司的企业微信,服务商管理后台中的本地应用进行回调验证. 听起来一脸懵逼,没搞过企业微信对接情况.一头雾水,不知道如何下手. 先讲解一下,企业微信情况. 登录到企业微信后,右上角服 ...

  8. C# winform C/S WebBrowser 微信第三方登录

    网上很多的资料都是B/S结构的,这里是基于C# C/S 结构的微信第三方授权登录 一.准备知识 1 http Get和Post方法.做第三方授权登录,获取信息基本上都是用get和post方法,做之前需 ...

  9. 微信公众号与APP微信第三方登录账号打通

    一个项目同时开发了APP和微信服务号,需要做到APP和微信服务号的账号互通同步,也就是说一个账号在2个地方都可以用,当然这个前提是保证你公司自己的服务器的数据库用的是同一套. 为保证用户数据的唯一性, ...

随机推荐

  1. PSQLException: An I/O error occurred while sending to the backend.

    postgresql批量新增数据时,批量插入的数据量太大了,造成了IO异常 只能把这么多数据先进行分割,再批量插入,但是感觉这种方式不是最优解,先暂时顶着,具体List分割方式如下: package ...

  2. linux中SIGHUP与nohup的关系

    SIGHUP信号与控制终端   UNIX中进程组织结构为 session (会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程.一个session可能会有一个session首进程, ...

  3. 虚拟机ubuntu16下cheese打开摄像头黑屏问题

    在win7上安装了一个ubuntu1604的虚拟机: 在虚拟机下打开电脑上连接的摄像头时,用ubuntu16自带的cheese软件查看是黑屏: 但是cheese上有摄像头名字显示,就是打不开:如下图 ...

  4. ubuntu16 安装 qBittorrent ( Linux下BT下载图形工具 )

    qBittorrent 是QT编写的一款BT下载软件,支持FreeBSD, Linux, macOS, OS/2, Windows: 官网:https://www.qbittorrent.org/ 在 ...

  5. h5 唤起app或跳转appStore

    //唤起app通过唤端媒介(URL Scheme)   //微信浏览器自6.3.x版本起禁用了大多数Scheme跳转功能,扫一扫目前可用   // URL 的组成:   // [scheme:][// ...

  6. ES6 - 字符串的扩展(模版字符串)

    模板字面量的最简单语法,是使用反引号( `)(Tab上面那个键)来包裹普通字符串,而不是用双引号或单引号. <!DOCTYPE html> <html lang="en&q ...

  7. PHP商品秒杀问题解决方案实例详解【mysql与redis】

    本文实例讲述了PHP商品秒杀问题解决方案.分享给大家供大家参考,具体如下: 引言 假设num是存储在数据库中的字段,保存了被秒杀产品的剩余数量. if($num > 0){ //用户抢购成功,记 ...

  8. PHP 动态输出 svgz 格式图片

    使用PHP动态生成SVGZ图片(gzip压缩的SVG) 经测试SVG的动画性能很差,简单的动画CPU都能占到 30%左右. 可能的用途: 动态天气图片 访问统计计数图片 文字验证生成 动态头像 静态外 ...

  9. leetcode No.500 键盘行 keyboard-row (Python3实现)

    题目描述 给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词.键盘如下图所示. 示例: 输入: ["Hello", "Alaska", " ...

  10. (转载)理解Spatial Transformer Networks

    理解Spatial Transformer Networks 转载于:知乎-SIGAI 书的购买链接 书的勘误,优化,源代码资源 获取全文PDF请查看:理解Spatial Transformer Ne ...