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. Centos7 .net core 2.0安装使用

    一.添加dotnet产品Feed sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c 'ech ...

  2. C语言之“字符”与“字符串”之间的区别解析

    在C语言中,“字符”与“字符串”之间,是有区别的.这一篇文章中,我们将介绍一下,在C语言中的“字符”与“字符串”,它们之间的区别. 首先,一个很明显的区别是: “字符”,使用单引号作为定界符,而“字符 ...

  3. Zabbix实战-简易教程--中间件kafka监控

    一.环境准备 1.安装kafka Step 1: 下载代码 你可以登录Apache kafka 官方下载.http://kafka.apache.org/downloads.html备注:2.11-1 ...

  4. Mybatis27题

    1.什么是Mybatis? Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement等繁杂 ...

  5. python lambda表达式简单用法【转】

    python lambda表达式简单用法 1.lambda是什么? 看个例子: g = lambda x:x+1 看一下执行的结果: g(1) >>>2 g(2) >>& ...

  6. Oracle JDBC prefetch: how to avoid running out of RAM

    Using Oracle java JDBC (ojdbc6 11.2.0.4), loading a query with many rows takes forever (high latency ...

  7. 前端知识点回顾之重点篇——CSS中flex布局

    flex布局 来源: http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool 采用 Flex 布局的元素 ...

  8. python开发笔记-pymsslq连接操作SqlServer数据库

    1. 普通连接测试 官方文档样例:http://pymssql.org/en/latest/pymssql_examples.html pymssql模块使用指南:https://blog.csdn. ...

  9. (转)ES6系列——let和const深入理解

    原文:https://juejin.im/post/59e6a86d518825422c0cbb6f https://www.cnblogs.com/slly/p/9234797.html-----l ...

  10. spring 支持集中 bean scope?

    Spring bean 支持 5 种 scope: Singleton - 每个 Spring IoC 容器仅有一个单实例. Prototype - 每次请求都会产生一个新的实例. Request - ...