上回分解到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授权登录)---第二步:开始逐步实现企业微信登录的更多相关文章

  1. AbpZero之企业微信---登录(拓展第三方auth授权登录)---第三步:需要注意事项

    1.AbpZero的auth登录会在数据库中的AbpUserLogins表会根据你登录的ProviderKey和Provider来生成生成一条记录,ProviderKey在表中是唯一的: 2.要登录成 ...

  2. AbpZero之企业微信---登录(拓展第三方auth授权登录)---第一步:查看AbpZero的auth第三方登录的底层机制

    在AbpZero框架中,auth登录接口位于Web.Core库下的Controllers文件夹的TokenAuthController.cs的ExternalAuthenticate方法 Extern ...

  3. 解决微信公众号授权登录和开放平台微信第三方应用授权登录获取到的用户Openid关联问题

    开发背景: 最近一段时间一直在做关于微信方面的网站应用开发,这段时间也收获的不少关于微信开发方面的开发技能,接触的比较多的主要有微信公众号和微信网站app第三方登录授权,以及微信会员卡,优惠券和扫描二 ...

  4. Unity利用Share SDK实现QQ、微信及微博第三方登录及定制内容分享(附代码)

    最近因为公司的项目需要添加一些实用性的功能,需要添加第三方登录及分享,采用的是Mob的SDK,可以先到其官网下载对应的SDK 点击这里,为了方便后期进行数据统计和分析,所以可以先添加一个应用,添加成功 ...

  5. php微信开放平台--第三方网页微信扫码登录(OAuth2.0)

    第一.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提 ...

  6. 第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、StackOverflow

    Netnr.Login 第三方OAuth授权登录 支持第三方登录 三方 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 安装 ( ...

  7. 【小程序】基于.NET CORE2.1 的 微信开放平台 第三方平台开发 教程一 准备工作

    微信第三方平台概述 公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认 ...

  8. 《微信小程序七日谈》- 第五天:你可能要在登录功能上花费大力气

    <微信小程序七日谈>系列文章: 第一天:人生若只如初见: 第二天:你可能要抛弃原来的响应式开发思维: 第三天:玩转Page组件的生命周期: 第四天:页面路径最多五层?导航可以这么玩: 第五 ...

  9. Oauth2.0 QQ&微信&微博实现第三方登陆

    一.写在前面 目前对于大多数的App或Web网站都支持有第三方登陆这个功能,用户可使用 QQ/ 微信/ 微博 帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户.最近在新项目上刚好用到了,在 ...

随机推荐

  1. 批量删除进程清理 minerd

    发现顽固minerd 进程与ntp一起启动,所以一起杀掉 yum remove ntp kill -9 `ps -ef | grep ntp|awk '{print $2}'` kill -9 `ps ...

  2. phpStudy7——MySql数据库的增删查改

    1. 添加数据: //添加数据 $strsql = "insert into user_info(userId,userName,phoneNumber,userScore,dataTime ...

  3. anaconda+theano+keras手写字符识别新版

    标题介绍运行环境了win7 看网上好多keras识别minist 但是一般由于版本问题,无法直接用,,,这里还要特别感谢keras中文文档作者(三当家SCP).教程整的非常好.还有就是最好你在安装an ...

  4. 【校招面试 之 C/C++】第1题 为什么优先使用构造函数的初始化列表

    1.首先看一个例子: #include<iostream> using namespace std; class Test1 { public: Test1() // 无参构造函数 { c ...

  5. jquery获取当前屏幕宽度

    参考文章 <script type="text/javascript"> $(document).ready(function() { alert($(window). ...

  6. [leetcode]381. Insert Delete GetRandom O(1) - Duplicates allowed常数时间插入删除取随机值

    Design a data structure that supports all following operations in average O(1) time. Note: Duplicate ...

  7. actionView

    类似于actionBar也是在导航栏里用但是他使用的是menu菜单设置菜单项的AsAction=“always|withText” 本例使用LoaderCallbacks<Cursor>接 ...

  8. discuz目录结构和插件创建

    discuz目录结构 api 外部接口功能实现 archiver 静态文档,静态化所用 config 配置 data 生成的数据 install 安装目录 source 源代码核心目录 |--modu ...

  9. php Pthread 多线程 (二) Worker和Threaded

    <?php //Worker是具有持久化上下文(执行环境)的线程对象 //Worker对象start()后,会执行run()方法,run()方法执行完毕,线程也不会消亡 class MySqlW ...

  10. TPshop学习

    笔记大纲: tpshop目录结构 功能模块 函数库 重要配置 助手函数 插件 模板 1.TPshop目录结构 目录结构(来自官方视频截图) 看这个图,目录结构一目了然.下面要讲的内容也是根据这个图展开 ...