视频教程(使用+实现原理):https://share.weiyun.com/57HKopT 建议直接看视频

源码地址:https://github.com/bxjg1987/abpGeneralModules

库版本.net core 3.1

我的abp版本:abp5.3 .net core 3.1

请先看微信小程序官方文档。下面说说abp中如何使用。原生asp.net core可以参考实现

服务端配置

1、安装nuget包

Install-Package BXJG.WeChart -Version 

2、修改配置文件 abp.web.host/appsettings.json

3、修改启动配置类abp.web.host//StartupAuthConfigurer.cs

因为startup中是通过这个类中的静态方法注册身份验证相关服务的

 public static void Configure(IServiceCollection services, IConfiguration configuration)
         {
             var authBuilder = services.AddAuthentication(options =>
             {
                 options.DefaultAuthenticateScheme = "JwtBearer";
                 options.DefaultChallengeScheme = "JwtBearer";
             });

             if (bool.Parse(configuration["Authentication:JwtBearer:IsEnabled"]))
             {
                 authBuilder.AddJwtBearer("JwtBearer", options =>
                 {
                     options.Audience = configuration["Authentication:JwtBearer:Audience"];

                     options.TokenValidationParameters = new TokenValidationParameters
                     {
                         // The signing key must match!
                         ValidateIssuerSigningKey = true,
                         IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(configuration["Authentication:JwtBearer:SecurityKey"])),

                         // Validate the JWT Issuer (iss) claim
                         ValidateIssuer = true,
                         ValidIssuer = configuration["Authentication:JwtBearer:Issuer"],

                         // Validate the JWT Audience (aud) claim
                         ValidateAudience = true,
                         ValidAudience = configuration["Authentication:JwtBearer:Audience"],

                         // Validate the token expiry
                         ValidateLifetime = true,

                         // If you want to allow a certain amount of clock drift, set that here
                         ClockSkew = TimeSpan.Zero
                     };

                     options.Events = new JwtBearerEvents
                     {
                         OnMessageReceived = QueryStringTokenResolver
                     };
                 });
             }

             if (bool.Parse(configuration["Authentication:WeChartMiniProgram:IsEnabled"]))
             {
                 authBuilder.AddWeChartMiniProgram(opt =>
                 {
                     opt.AppId = configuration["Authentication:WeChartMiniProgram:AppId"];
                     opt.Secret = configuration["Authentication:WeChartMiniProgram:Secret"];

                     opt.ClaimActions.MapJsonKey("nickName", "nickName");
                     opt.ClaimActions.MapJsonKey("avatarUrl", "avatarUrl");
                     opt.ClaimActions.MapJsonKey("gender", "gender");
                     opt.ClaimActions.MapJsonKey("country", "country");
                     opt.ClaimActions.MapJsonKey("province", "province");
                     opt.ClaimActions.MapJsonKey("city", "city");
                     opt.ClaimActions.MapJsonKey("language", "language");
                 });
             }
         }

更多配置请参考视频

4、实现abp集成

找到abp.web.core/controllers/TokenAuthController

先注入UserManager

然后添加下面的方法

         [HttpPost]
         public async Task<ExternalAuthenticateResultModel> WeChartMiniProgramLoginAsync()
         {

             //从第三方登录拿到当前用户(包含openId、sessionKey)
             var t = await base.HttpContext.AuthenticateAsync(MiniProgramConsts.AuthenticationScheme);//间接使用第三方身份验证方案获取信息
             //拿到openId
             var openid = t.Principal.Claims.Single(c => c.Type == ClaimTypes.NameIdentifier).Value;
             var tenancyName = GetTenancyNameOrNull();
             //尝试做第三发登录(内部通过openid找到本地账号做登录),
             var loginResult = await _logInManager.LoginAsync(new UserLoginInfo(MiniProgramConsts.AuthenticationScheme, openid, MiniProgramConsts.AuthenticationSchemeDisplayName), tenancyName);
             //根据登录结果,若成功则直接返回jwtToken 或者自动注册后返回
             switch (loginResult.Result)
             {
                 case AbpLoginResultType.Success:
                     {
                         //更新微信用户信息
                         foreach (var item in t.Principal.Claims)
                         {
                             await userManager.ReplaceClaimAsync(loginResult.User, new Claim(item.Type, ""), item);
                         }

                         //返回jwtToken
                         var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity));
                         return new ExternalAuthenticateResultModel
                         {
                             AccessToken = accessToken,
                             EncryptedAccessToken = GetEncryptedAccessToken(accessToken),
                             ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds
                         };
                     }
                 case AbpLoginResultType.UnknownExternalLogin:
                     {
                         //若未找到关联的本地账号则自动注册,再返回jwtToken
                         var newUser = await RegisterExternalUserAsync(new ExternalAuthUserInfo
                         {
                             Provider = MiniProgramConsts.AuthenticationScheme,
                             ProviderKey = openid,
                             Name = t.Principal.Claims.SingleOrDefault(c => c.Type == "nickName")?.Value,
                             EmailAddress = Guid.NewGuid().ToString("N") + "@mp.com",
                             Surname = "a"
                         });
                         if (!newUser.IsActive)
                         {
                             return new ExternalAuthenticateResultModel
                             {
                                 WaitingForActivation = true
                             };
                         }

                         // Try to login again with newly registered user!
                         loginResult = await _logInManager.LoginAsync(new UserLoginInfo(MiniProgramConsts.AuthenticationScheme, openid, MiniProgramConsts.AuthenticationSchemeDisplayName), tenancyName);
                         if (loginResult.Result != AbpLoginResultType.Success)
                         {
                             throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(
                                 loginResult.Result,
                                 openid,
                                 tenancyName
                             );
                         }
                         //保存微信用户信息(排出openid,因为它存储在userlogins里)
                         await userManager.AddClaimsAsync(loginResult.User, t.Principal.Claims.Where(c=>c.Type!= ClaimTypes.NameIdentifier));

                         return new ExternalAuthenticateResultModel
                         {
                             AccessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity)),
                             ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds
                         };
                     }
                 default:
                     {
                         throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(
                             loginResult.Result,
                             openid,
                             tenancyName
                         );
                     }
             }
         }

小程序端处理

小程序调用wx.login拿到code,然后调用wx.getUserInfo拿到用户昵称、头像、性别.....等数据

将上面的数据组成json  Post提交到  我方服务器/wechart-miniProgram-signin

此时会返回一个加密的cookie字符串,小程序端需要想法从响应的cookie中拿到此字符串

用上面的字符串作为cookie Post请求  我方服务器/api/TokenAuth/WeChartMiniProgramLogin

此时服务端会返回jwtToken

后续请求跟之前的处理就一样了。

asp.net core 3.x 微信小程序登录库(也可用于abp)的更多相关文章

  1. Asp.Net Core SignalR 与微信小程序交互笔记

    什么是Asp.Net Core SignalR Asp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给 ...

  2. 基于Shiro,JWT实现微信小程序登录完整例子

    小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html ...

  3. 微信小程序登录方案

    微信小程序登录方案 登录程序 app.js 调用wx.login获取code 将code作为参数请求自己业务登录接口获取session_key 存储session_key 如果有回调执行回调 App( ...

  4. 微信小程序登录,获取code,获取openid,获取session_key

    微信小程序登录 wx.login(Object object) 调用接口获取登录凭证(code).通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session ...

  5. 微信小程序登录JAVA后台

    代码地址如下:http://www.demodashi.com/demo/12736.html 登录流程时序登录流程时序 具体的登录说明查看 小程序官方API 项目的结构图: springboot项目 ...

  6. 微信小程序登录对接Django后端实现JWT方式验证登录

    先上效果图 点击授权按钮后可以显示部分资料和头像,点击修改资料可以修改部分资料. 流程 1.使用微信小程序登录和获取用户信息Api接口 2.把Api获取的用户资料和code发送给django后端 3. ...

  7. 全栈项目|小书架|微信小程序-登录及token鉴权

    小程序登录 之前也写过微信小程序登录的相关文章: 微信小程序~新版授权用户登录例子 微信小程序-携带Token无感知登录的网络请求方案 微信小程序开通云开发并利用云函数获取Openid 也可以通过官方 ...

  8. Flask与微信小程序登录(后端)

    开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + flask + 微信小程序实现用户快速注册登录方案(本文主要进行后 ...

  9. Taro -- 微信小程序登录

    Taro微信小程序登录 1.调用Taro.login()获取登录凭证code: 2.调用Taro.request()将code传到服务器: 3.服务器端调用微信登录校验接口(appid+appsecr ...

随机推荐

  1. LINQ之路 6:延迟执行(Deferred Execution) 笔记

    这里刚看的时候不理解. 这个特性在我们通过foreach循环创建查询时会变成一个真正的陷阱.假如我们想要去掉一个字符串里的所有元音字母,我们可能会写出如下的query: IEnumerable< ...

  2. 挑战中英实时语音翻译——Skype Translator 中文预览版登陆中国

    Translator 中文预览版登陆中国" title="挑战中英实时语音翻译--Skype Translator 中文预览版登陆中国"> 今天,我们正式宣布在中国 ...

  3. 吴裕雄--天生自然 R语言开发学习:时间序列(续一)

    #-----------------------------------------# # R in Action (2nd ed): Chapter 15 # # Time series # # r ...

  4. MySQL5.7报错[ERROR] Unix socket lock file is empty /tmp/mysql.sock.lock的解决方法

    发现MySQL服务器因系统磁盘写满导致服务停了,清理磁盘后启动服务时无法正常启动,查看localhost.err日志发现如下报错: [ERROR] Unix socket lock file is e ...

  5. Selenium&Pytesseract模拟登录+验证码识别

    验证码是爬虫需要解决的问题,因为很多网站的数据是需要登录成功后才可以获取的. 验证码识别,即图片识别,很多人都有误区,觉得这是爬虫方面的知识,其实是不对的. 验证码识别涉及到的知识:人工智能,模式识别 ...

  6. 广州CVTE招聘-测试开发工程师

    内推邮箱:keweisheng@cvte.com 地点:广州 公司简介 CVTE成立于2005年,总部位于广州科学城,旗下设有多家独立的子公司,在香港设有全球服务中心,在国内设有21个营销服务中心和近 ...

  7. vue项目实战

    本篇文章主要介绍了vue的环境配置,vue项目的目录结构以及在开发vue项目中问题的一些解决方案. 环境配置及目录结构 1.安装node.js(http://www.runoob.com/nodejs ...

  8. (转)linux如何获取鼠标相对位置信息

    #include <stdio.h> #include <stdlib.h> #include <linux/input.h> #include <fcntl ...

  9. Linux用户组的添加及属性的更改

    用户组的创建: 12345 groupadd [OPTION] 组名 -g GID 指明GID号:[GID_MIN, GID_MAX] -r 创建系统组 CentOS 6: ID<500 Cen ...

  10. 阿里为何要用独立APP挖微信微商墙角?

    ​ 微商,这个被很多人看来是逃离马云魔咒,和淘宝抗衡的电商模式,自诞生到狂飙就伴随着种种争议.由于传播效率极强,在很长时间里也一直是不少人口中津津乐道的神话故事和救市良方.以至于,淘宝推出各种手段封杀 ...