前言

微信相关配置请参考 微信公众平台 的这篇文章。注意授权回调域名一定要修改正确。

微信网页授权是通过OAuth2.0机制实现的,所以我们可以使用 https://github.com/china-live/QQConnect 这个开源项目提供的中间件来实现微信第三方登录的流程。

开发流程

1、新建一个.net core webapi 项目。在NuGet中查找并安装 AspNetCore.Authentication.WeChat 包。

2、修改 appsettings.json 配置文件,增加以下配置:

 "Authentication": {
"WeChat": {
"AppId": "微信AppID",
"AppSecret": "微信AppSecret"
}
},
"Logging": {
"LogLevel": {
"Default": "Debug", //日志级别从低到高,依次为:Debug,Information,Warning,Error,None
"Microsoft.EntityFrameworkCore": "Error",
"System": "Error"
}
}

3、修改 Startup

         services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddAuthentication()
.AddWeChat(wechatOptions =>
{
wechatOptions.AppId = Configuration["Authentication:WeChat:AppId"];
wechatOptions.AppSecret = Configuration["Authentication:WeChat:AppSecret"];
wechatOptions.UseCachedStateDataFormat = true;
});

4、新增 AccountController

     [Route("api/[controller]")]
[ApiController]
public class AccountController : ControllerBase
{
private const string LoginProviderKey = "LoginProvider";
private const string Provider_WeChat = "WeChat";
private readonly ILogger _logger;
private readonly IHttpContextAccessor _contextAccessor; public AccountController(ILogger<AccountController> logger,
IHttpContextAccessor contextAccessor)
{
_logger = logger;
_contextAccessor = contextAccessor;
}
/// <summary>
/// 微信登录
/// </summary>
/// <param name="redirectUrl">授权成功后的跳转地址</param>
/// <returns></returns>
[HttpGet("LoginByWeChat")]
public IActionResult LoginByWeChat(string redirectUrl)
{
var request = _contextAccessor.HttpContext.Request;
var url = $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}Callback?provider={Provider_WeChat}&redirectUrl={redirectUrl}";
var properties = new AuthenticationProperties { RedirectUri = url };
properties.Items[LoginProviderKey] = Provider_WeChat;
return Challenge(properties, Provider_WeChat);
}
/// <summary>
/// 微信授权成功后自动回调的地址
/// </summary>
/// <param name="provider"></param>
/// <param name="redirectUrl">授权成功后的跳转地址</param>
/// <returns></returns>
[HttpGet("LoginByWeChatCallback")]
public async Task<IActionResult> LoginByWeChatCallbackAsync(string provider = null, string redirectUrl = "")
{
var authenticateResult = await _contextAccessor.HttpContext.AuthenticateAsync(provider);
if (!authenticateResult.Succeeded) return Redirect(redirectUrl);
var openIdClaim = authenticateResult.Principal.FindFirst(ClaimTypes.NameIdentifier);
if (openIdClaim == null || openIdClaim.Value.IsNullOrWhiteSpace())
return Redirect(redirectUrl);
//TODO 记录授权成功后的微信信息
var city = authenticateResult.Principal.FindFirst("urn:wechat:city")?.Value;
var country = authenticateResult.Principal.FindFirst(ClaimTypes.Country)?.Value;
var headimgurl = authenticateResult.Principal.FindFirst(ClaimTypes.Uri)?.Value;
var nickName = authenticateResult.Principal.FindFirst(ClaimTypes.Name)?.Value;
var openId = authenticateResult.Principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
var privilege = authenticateResult.Principal.FindFirst("urn:wechat:privilege")?.Value;
var province = authenticateResult.Principal.FindFirst("urn:wechat:province")?.Value;
var sexClaim = authenticateResult.Principal.FindFirst(ClaimTypes.Gender);
int sex = ;
if (sexClaim != null && !sexClaim.Value.IsNullOrWhiteSpace())
sex = int.Parse(sexClaim.Value);
var unionId = authenticateResult.Principal.FindFirst("urn:wechat:unionid")?.Value;
_logger.LogDebug($"WeChat Info=> openId: {openId},nickName: {nickName}");
return Redirect($"{redirectUrl}?openId={openIdClaim.Value}");
}
}

5、将网站发布到外网,请求

https://你的授权域名/api/account/LoginByWeChat?redirectUrl=授权成功后要跳转的页面

即可调起微信授权页面。

注意

微信授权必须使用https

微信开放平台和微信公众平台都有提供网站用微信登录的接口,前者适用于任何网站,后者只适用于微信服务号的内嵌网站

本篇相关源码地址:https://github.com/ren8179/QrF.OAuth.WeChat/tree/master

.net Core2.2 WebApi通过OAuth2.0实现微信登录的更多相关文章

  1. ASP.NET WebApi 基于OAuth2.0实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将是我们需要思考的问题.为了保护我们的WebApi数 ...

  2. 微信公众平台开发—利用OAuth2.0获取微信用户基本信息

    在借鉴前两篇获取微信用户基本信息的基础下,本人也总结整理了一些个人笔记:如何通过OAuth2.0获取微信用户信息 1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url ...

  3. DRF接入Oauth2.0认证[微博登录]报错21322重定向地址不匹配

    DRF接入Oauth2.0认证[微博登录]报错21322重定向地址不匹配 主题自带了微博登陆接口,很简单的去新浪微博开放平台创建了网页应用,然后把APP ID和 AppSecret填好后,以为大功告成 ...

  4. .Net WebApi 实现OAuth2.0认证

    现在多数公众平台提供的api都使用OAuth2.0认证模式,最近在搞Android方面的开发,身份认证和权限控制的各方面比较来说,使用OAuth认证的还是比较靠谱,OAuth2.0的协议可以参考htt ...

  5. PHP微信公众平台oauth2.0网页授权登录类的封装demo

    一.微信授权使用的是OAuth2.0授权的方式.主要有以下简略步骤: 第一步:用户同意授权,获取code 第二步:通过code换取网页授权access_token 第三步:拉取用户信息(需scope为 ...

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

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

  7. 使用微服务架构思想,设计部署OAuth2.0授权认证框架

    1,授权认证与微服务架构 1.1,由不同团队合作引发的授权认证问题 去年的时候,公司开发一款新产品,但人手不够,将B/S系统的Web开发外包,外包团队使用Vue.js框架,调用我们的WebAPI,但是 ...

  8. API代理网关和OAuth2.0授权认证框架

    API代理网关和OAuth2.0授权认证框架 https://www.cnblogs.com/bluedoctor/p/8967951.html 1,授权认证与微服务架构 1.1,由不同团队合作引发的 ...

  9. OAuth2.0授权

    一.什么是OAuth2.0官方网站:http://oauth.net/ http://oauth.net/2/ 权威定义:OAuth is An open protocol to allow secu ...

随机推荐

  1. Delpher 必记-delphi环境安装

    //Delpher 必记 环境: 安装包: 1.所有第三方控件包放在没有中文名的路径:如F:\DComp 安装包放在对应的版本的文件夹里面(实际中没有分类),然后看安装包的引用路径和输出路径,都要设定 ...

  2. Database学习 - mysql 数据库 表操作

    mysql 数据库 表操作 创建数据表 基本语法格式: 创建数据表: create table 表名( 字段名 datatype 约束, 字段名 datatype 约束, ...... ) 修改表名 ...

  3. DSO 代码框架

    从数据流的角度讲一遍 DSO 代码框架. DSO 的入口是 FullSystem::addActiveFrame,输入的影像生成 FrameHessian 和 FrameShell 的 Object, ...

  4. Generative Adversarial Nets(原生GAN学习)

    学习总结于国立台湾大学 :李宏毅老师 Author: Ian Goodfellow • Paper: https://arxiv.org/abs/1701.00160 • Video: https:/ ...

  5. 硬盘SMART参数解释

    Raw Read Error Rate           底层读取错误率,高值暗示盘体/磁头有问题 Throughput Performance        读写通量性能 (越高越好)      ...

  6. WebSphere的jython编码的一个坑

    was5.1版本,用"name=" in line这类判断字符串包含的方式时,系统会提示报错 TypeError: string member test needs char le ...

  7. V$SQLAREA

    1.查看消耗资源最多的SQL: SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls FROM V$SQLAREA W ...

  8. 网站遭遇CC及DDOS攻击紧急处理方案

    检测访问是否是CC攻击的命令: 80口为网站的访问端口,可以根据实际情况进行修改 # netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: ' ...

  9. mysql报错问题解决MySQL server PID file could not be found!

    MySQL server PID file could not be found! 无法启动mysql服务 # service mysqld start MySQL server PID file c ...

  10. TCP端口转发(centos7)

    =============================================== 2019/2/14_第1次修改                       ccb_warlock == ...