上回分解到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. 利用简单的参数传递来实现单条查询的easyui-datagrid

    前一阵子老师给出了一个题目, 说让设计个表格, 学生系统的, 可以查询学生的信息和成绩, 科目自己定, 数据库建表也自己定. 数据库的建表可是建的相当的简陋, 反正老师不是很满意, 后来数据表格做出来 ...

  2. openresty + luajit

    https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/brief.html ftp://ftp.csx.cam.a ...

  3. DP解LCS问题模板及其优化

    LCS--Longest Common Subsequence,即最长公共子序列,一般使用DP来解. 常规方法: dp[i][j]表示字符串s1前i个字符组成的字符串与s2前j个字符组成的字符串的LC ...

  4. centos 系统下彻底删除mysql

    yum remove mysql mysql-server mysql-libs compat-mysql51 rm -rf /var/lib/mysql (删除数据库) rm /etc/my.cnf ...

  5. 转)Ubuntu14安装wireshark进行抓包

    转自:http://jingyan.baidu.com/article/c74d60009d992f0f6a595de6.html 背景: ubuntu14.04/64位 为了抓包和分析包 安装过程: ...

  6. jQuery之双下拉框

    双下拉框要实现的效果,实际上就是左边下拉选择框里的内容,可以添加到右边,而右边同理.写了个简单的例子,来说明一下. 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  7. Castle ActiveRecord学习(一)简介

    简介 来源:http://www.cnblogs.com/zxj159/p/4082987.html 一.Active Record(活动记录)模式 Active Record是业务逻辑层中(< ...

  8. NABCD模型--软件工程

    1.N (Need 需求) 我们通过网络调查问卷的方式,收集样本数据,并对其进行分析和总结. 1.你是否为在校学生? 7.如果用过,你觉得还应该需要添加什么功能 通过调查发现,大多数学生并不是特别了解 ...

  9. Vue.js 与 Laravel 分离

    首先表示折腾了十来天的php-laravel框架和vue的结合开发又偏前端实在是太大的阻碍,首先laravel的机制就是写完路由router再加载blade模板的.如果要在laravel工程里面加载一 ...

  10. 向一个文件流写入一个数据块---fwrite

    函数原型:int fwrite(const void *buffer,size_t size,size_t count,FILE *stream); 参数说明:buffer:用于写入到文件的数据地址. ...