AbpZero之企业微信---登录(拓展第三方auth授权登录)---第二步:开始逐步实现企业微信登录
上回分解到AbpZero的auth登录机制,这里我们开始着手逐步实现我们的auth登录。
我们新建一个类库XXXX.Web.Authentication.External
在类库下新建一个类QYWechatAuthProviderApi.cs并继承ExternalAuthProviderApiBase 由于我用的是盛派的SDK,所以还要在项目Nuget盛派的工程dll

using Abp.AspNetZeroCore.Web.Authentication.External;
using Abp.Domain.Repositories;
using Abp.Runtime.Caching;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Schema;
using Senparc.Weixin;
using Senparc.Weixin.HttpUtility;
using Senparc.Weixin.Work.AdvancedAPIs.OAuth2;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks; namespace XXXX.Web.Authentication.External
{
public class WechatAuthProviderApi : ExternalAuthProviderApiBase
{
public const string Name = "Wechat";
private readonly ICacheManager _cacheManager;
private readonly IExternalAuthConfiguration _externalAuthConfiguration;
WeChatMiniProgramOptions _options;
JSchema schema = JSchema.Parse(JsonConvert.SerializeObject(new UsersWechat()));
public WechatAuthProviderApi(ICacheManager cacheManager,IExternalAuthConfiguration externalAuthConfiguration)
{
_cacheManager = cacheManager;
_externalAuthConfiguration = externalAuthConfiguration;
var r = externalAuthConfiguration.Providers.First(p => p.Name == Name);
_options = new WeChatMiniProgramOptions
{
AppId = r.ClientId,
Secret = r.ClientSecret
}; }
public override async Task<ExternalAuthUserInfo> GetUserInfo(string accessCode)
{
UsersWechat wechat = new UsersWechat(); string accessToken = _cacheManager.GetCache("CacheName").Get("Login", () => GetToken(_options.AppId, _options.Secret));
if (!string.IsNullOrWhiteSpace(accessToken))
{
var url = string.Format(Config.ApiWorkHost + "/cgi-bin/user/getuserinfo?access_token={0}&code={1}", accessToken, accessCode); var redata = Get.GetJson<GetUserResult>(url);
if (!string.IsNullOrWhiteSpace(redata.user_ticket))
{
UserTicket tiket = new UserTicket
{
user_ticket = redata.user_ticket
};
url = string.Format(Config.ApiWorkHost + "/cgi-bin/user/getuserdetail?access_token={0}", accessToken);
// wechat = Post.GetResult<UsersWechat>(JsonConvert.SerializeObject(tiket));
wechat = await GetUserMsg(url, tiket);
}
} var t = wechat == null ? new ExternalAuthUserInfo() : new ExternalAuthUserInfo
{
EmailAddress = wechat.email,
Surname = wechat.name,
ProviderKey = wechat.userid,
Provider = Name,
Name = wechat.userid
};
return t; } private async Task<UsersWechat> GetUserMsg(string url, UserTicket tiket)
{
//序列化将要传输的对象
string obj = JsonConvert.SerializeObject(tiket);
HttpContent content = new StringContent(obj); HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var result = await client.PostAsync(url, content);
if (result.IsSuccessStatusCode)
{
string re = await result.Content.ReadAsStringAsync();
var jo = JObject.Parse(re);
if (jo.IsValid(schema))
{
var m = JsonConvert.DeserializeObject<UsersWechat>(re);
return m;
}
}
return null;
} private string GetToken(string AppId, string Secret)
{
if (string.IsNullOrWhiteSpace(AppId) || string.IsNullOrWhiteSpace(Secret))
{
return "";
}
return Senparc.Weixin.Work.Containers.AccessTokenContainer.TryGetTokenAsync(AppId, Secret).Result;
} public class UsersWechat
{
public string userid { get; set; }
public string name { get; set; } public string mobile { get; set; } public string gender { get; set; } public string email { get; set; } public string avatar { get; set; } public string qr_code { get; set; } } public class GetUserResult
{
public string errcode { get; set; }
public string errmsg { get; set; }
public string CorpId { get; set; }
public string UserId { get; set; }
public string DeviceId { get; set; } public string user_ticket { get; set; } public string expires_in { get; set; } } public class UserTicket
{
public string user_ticket { get; set; }
} }
}
以上就是企业微信登录的代码了。
最后,我们怎么开启企业微信的登录呢?
我们还需要再运行站点下的appsettings.json文件中加上我们企业微信的appid和密钥
"Facebook": {
"IsEnabled": "true",
"AppId": "",
"AppSecret": ""
},
"Google": {
"IsEnabled": "true",
"ClientId": "",
"ClientSecret": ""
},
"Wechat": {
"IsEnabled": "true",
"AppId": "xxxx",
"Secret": "xxx"
},
最后一步:在站点的BanchWebHostModule.cs的ConfigureExternalAuthProviders方法下添加注册
if (bool.Parse(_appConfiguration["Authentication:Wechat:IsEnabled"]))
{
externalAuthConfiguration.Providers.Add(
new ExternalLoginProviderInfo(
WechatAuthProviderApi.Name,
_appConfiguration["Authentication:Wechat:AppId"],
_appConfiguration["Authentication:Wechat:Secret"],
typeof(QYWechatAuthProviderApi)
)
);
}
自此,企业微信登录就完成了,这里主要用到的是依赖注入和反射。
AbpZero之企业微信---登录(拓展第三方auth授权登录)---第二步:开始逐步实现企业微信登录的更多相关文章
- AbpZero之企业微信---登录(拓展第三方auth授权登录)---第三步:需要注意事项
1.AbpZero的auth登录会在数据库中的AbpUserLogins表会根据你登录的ProviderKey和Provider来生成生成一条记录,ProviderKey在表中是唯一的: 2.要登录成 ...
- AbpZero之企业微信---登录(拓展第三方auth授权登录)---第一步:查看AbpZero的auth第三方登录的底层机制
在AbpZero框架中,auth登录接口位于Web.Core库下的Controllers文件夹的TokenAuthController.cs的ExternalAuthenticate方法 Extern ...
- 解决微信公众号授权登录和开放平台微信第三方应用授权登录获取到的用户Openid关联问题
开发背景: 最近一段时间一直在做关于微信方面的网站应用开发,这段时间也收获的不少关于微信开发方面的开发技能,接触的比较多的主要有微信公众号和微信网站app第三方登录授权,以及微信会员卡,优惠券和扫描二 ...
- Unity利用Share SDK实现QQ、微信及微博第三方登录及定制内容分享(附代码)
最近因为公司的项目需要添加一些实用性的功能,需要添加第三方登录及分享,采用的是Mob的SDK,可以先到其官网下载对应的SDK 点击这里,为了方便后期进行数据统计和分析,所以可以先添加一个应用,添加成功 ...
- php微信开放平台--第三方网页微信扫码登录(OAuth2.0)
第一.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提 ...
- 第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、StackOverflow
Netnr.Login 第三方OAuth授权登录 支持第三方登录 三方 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 安装 ( ...
- 【小程序】基于.NET CORE2.1 的 微信开放平台 第三方平台开发 教程一 准备工作
微信第三方平台概述 公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认 ...
- 《微信小程序七日谈》- 第五天:你可能要在登录功能上花费大力气
<微信小程序七日谈>系列文章: 第一天:人生若只如初见: 第二天:你可能要抛弃原来的响应式开发思维: 第三天:玩转Page组件的生命周期: 第四天:页面路径最多五层?导航可以这么玩: 第五 ...
- Oauth2.0 QQ&微信&微博实现第三方登陆
一.写在前面 目前对于大多数的App或Web网站都支持有第三方登陆这个功能,用户可使用 QQ/ 微信/ 微博 帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户.最近在新项目上刚好用到了,在 ...
随机推荐
- 利用 AWK 的数值计算功能提升工作效率(转载)
Awk 是一种优秀的文本样式扫描和处理工具.转文侧重介绍了 awk 在数值计算方面的运用,并通过几个实际工作中的例子,阐述了如何利用 awk 的计算功能来提高我们的工作效率.转文源自IBM Bluem ...
- poj2456(二分+贪心)
题目链接:http://poj.org/problem?id=2456 题意: 有n个呈线性排列的牲畜堋,给出其坐标,有c头牛,求把两头牛的最短距离的最大值. 思路: 先将坐标排个序.两头牛的最短距离 ...
- 43. Multiply Strings (String)
Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...
- python学习——urlparse模块
urlparse模块: 1.urlparse() 具体程序及结果如下: >>> url = 'http://i.cnblogs.com/EditPosts.aspx?opt=1'&g ...
- python之三级菜单作业
作业需求如下 1.根据用户的输入打印相应的省.市.县的信息 2.每次只要用户输入b,则返回上一级菜单 3.每次只要用户输入q,则直接退出 4.用户输错需要有提示 homework_dict = {'内 ...
- CentOS 7安装zabbix步骤
Zabbix配置安装 1.前期准备: 我自己的基础环境:CentOS 7 + Mysql 5.6 可以根据官网介绍一步一步安装,官网地址:https://www.zabbix.com/ 图1: 然后点 ...
- Vue.js 生命周期的应用
生命周期示意图 值得注意的几个钩子函数 activated 类型:Function 详细: keep-alive 组件激活时调用. 该钩子在服务器端渲染期间不被调用. 参考: 构建组件 - keep- ...
- 图片素材类Web原型制作分享-Pexels
Pexels是一个高清图片下载服务站点,为用户提供海量共享图片素材的网站,每周都会定量更新. 菜单栏和底部栏都是悬浮在固定位置,内容区域滚动.首页图片排列采用瀑布流的方式,多图片滚动.包含的页面有:浏 ...
- Dice 5 ==> dice 7
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
- 高性能 js -- 无阻塞加载脚本
参考: <<高性能JavaScript>> Nicbolas C. Zakas 著 javascript代码的下载和执行过程会阻塞浏览器的其他进程, 比如页面的绘制, 遇到&l ...