Asp.Net Core 企业微信静默授权的实现

 更新时间:2020-11-19 04:07:29   作者:佚名   我要评论(0)

企业微信接口文档
1. 构造授权网页链接

2.回调获取到 Code 通过code+access_token去 请求用户信息

3. 获取access_token

调试准备工作 -->内网穿透+域名 推荐向日

企业微信接口文档

1. 构造授权网页链接

2.回调获取到 Code 通过code+access_token去 请求用户信息

3. 获取access_token

调试准备工作 -->内网穿透+域名 推荐向日葵有免费的,免费的开发测试够用了

域名的配置成可信用

上代码 Demo下载

[ApiController]
  [Route("api/[controller]")]
  public class Auth2Controller : ControllerBase
  {

    private readonly string _agentId = "1000002";
    private readonly string _secret = "Y3f8ESBIBJoC8M_FPHOlpvmghS_Nn2ceFePRVZjw9_E";
    private readonly string _corpId = "wwbf72a7a059eac0f8";
    /// <summary>
    /// 授权地址
    /// </summary>
    private readonly string _auth2url = "https://open.weixin.qq.com/connect/oauth2/authorize";
    /// <summary>
    /// 授权回调地址
    /// </summary>
    private readonly string _callbackurl = "http://******.zicp.vip/auth2callback/api/Auth2/Callback";
    /// <summary>
    /// 获取access_token地址
    /// </summary>
    private readonly string _gettokenurl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
    /// <summary>
    /// 获取访问用户身份地址
    /// </summary>
    private readonly string _getuserurl = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo";


    private readonly ILogger<Auth2Controller> _logger;
    private readonly IHttpClientFactory _clientFactory;
    private readonly IMemoryCache _memoryCache;

    public Auth2Controller(ILogger<Auth2Controller> logger, IHttpClientFactory clientFactory, IMemoryCache memoryCache)
    {
      _logger = logger;
      _clientFactory = clientFactory;
      _memoryCache = memoryCache;
    }   

    [HttpGet]
    public IActionResult Auth2(string redirecturi)
    {
      string strurl = $"{_auth2url}?" +
          $"&appid={_corpId}" +
          $"&redirect_uri={System.Web.HttpUtility.UrlEncode(_callbackurl)}" +
          $"&response_type=code" +
          $"&scope={_secret}" +
          $"&agentid={_agentId}" +
          $"&state={System.Web.HttpUtility.UrlEncode(redirecturi)}#wechat_redirect";
      return Redirect(strurl);
    }

    [HttpGet("Callback")]
    public async Task<IActionResult> Callback(string code, string state)
    {
      /**
       1)code只能消费一次,不能重复消费。比如说,是否存在多个服务器同时消费同一code情况。
       2)code需要在有效期间消费(5分钟),过期会自动失效。
       */      
      string access_token = await GetAccessToken();
      string url = $"{_getuserurl}?access_token={access_token}&code=[code]";
      HttpResponseMessage response = await _clientFactory.CreateClient().GetAsync(url);
      if (response.StatusCode == System.Net.HttpStatusCode.OK)
      {
        using (var responseStream = await response.Content.ReadAsStreamAsync())
        {
          var userinfo = JsonConvert.DeserializeObject<dynamic>(new StreamReader(responseStream).ReadToEnd());
          int errcode = userinfo.errcode;
          if (errcode == 0)
          {
            //企业成员
            string UserId = userinfo.UserId;
            //外部成员
            string OpenId = userinfo.OpenId;
            /**
             userid是系统生成的可以修改一次;
             所以后面的业务逻辑如果遇到错误就要重新授权一下;   
             */
            if (UserId==null)
            {
              _memoryCache.Set<string>("UserId", OpenId);
            }
            else
            {
              _memoryCache.Set<string>("UserId", UserId);
            }
          }
          else
          {
            _logger.LogError($"getuserinfo请求错误:{userinfo.errmsg}");
            return Ok();
          }
        }
      }      
      return Redirect($"{System.Web.HttpUtility.UrlDecode(state)}?UserId={_memoryCache.Get<string>("UserId")}");
    }
    public async Task<string> GetAccessToken()
    {
      if (_memoryCache.Get<string>("AccessToken") == null)
      {
        string url = $"{_gettokenurl}?corpid={_corpId}&corpsecret={_secret}";
        HttpResponseMessage response = await _clientFactory.CreateClient().GetAsync(url);
        if (response.StatusCode == System.Net.HttpStatusCode.OK)
        {
          using (var responseStream = await response.Content.ReadAsStreamAsync())
          {
            var access_token_result = JsonConvert.DeserializeObject<dynamic>(new StreamReader(responseStream).ReadToEnd());
            int errcode = access_token_result.errcode;
            if (errcode == 0)
            {
              string access_token = access_token_result.access_token;
              int expires_in = access_token_result.expires_in;
              _memoryCache.Set<string>("AccessToken", access_token, DateTimeOffset.Now.AddSeconds(expires_in - 10));
            }
            else
            {
              _logger.LogError($"access_token请求错误:{access_token_result.errmsg }");
            }
          }

        }
      }
      return _memoryCache.Get<string>("AccessToken");
    }
  }

到此这篇关于Asp.Net Core 企业微信静默授权的实现的文章就介绍到这了,更多相关Asp.Net Core 静默授权内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • ASP.NET Core学习之使用JWT认证授权详解
  • 浅谈ASP.NET Core 中jwt授权认证的流程原理
  • asp.net core 授权详解
  • asp.net core2.2多用户验证与授权示例详解

相关文章

  • Asp.Net Core 企业微信静默授权的实现

    Asp.Net Core 企业微信静默授权的实现

    企业微信接口文档 1. 构造授权网页链接 2.回调获取到 Code 通过code+access_token去 请求用户信息 3. 获取access_token 调试准备工作 -->内网穿透+域名 推荐向日
    2020-11-19
  • 详解ASP.NET Core 反向代理部署知多少

    详解ASP.NET Core 反向代理部署知多少

    引言 最近在折腾统一认证中心,看到开源项目IdentityServer4.Admin集成了IdentityServer4和管理面板,就直接拿过来用了。在尝试Nginx部署时遇到了诸如虚拟目录映射,
    2020-11-19
  • 基于.NET的FluentValidation数据验证实现

    基于.NET的FluentValidation数据验证实现

    学习地址:官方文档,更多更详细的内容可以看官方文档。 FluentValidation 是一个基于 .NET 开发的验证框架,开源免费,而且优雅,支持链式操作,易于理解,功能完善
    2020-11-19
  • 手把手教你AspNetCore WebApi认证与授权的方法

    手把手教你AspNetCore WebApi认证与授权的方法

    前言 这几天小明又有烦恼了,之前给小红的接口没有做认证授权,直接裸奔在线上,被马老板发现后狠狠的骂了一顿,赶紧让小明把授权加上。赶紧Baidu一下,发现大家都在
    2020-11-19
  • net core webapi多版本控制与swagger(nswag)配置教程

    net core webapi多版本控制与swagger(nswag)配置教程

    前言 首先希望webapi支持多版本,swagger针对不同的版本可进行交互。多版本控制基于Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer包,swagger可以选择Swashbuck
    2020-11-19
  • ASP.NET Core3.1 Ocelot路由的实现

    ASP.NET Core3.1 Ocelot路由的实现

    1.路由 前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务。Ocelot当前仅以另一个http请求
    2020-11-19
  • 手把手教你AspNetCore WebApi数据验证的实现

    手把手教你AspNetCore WebApi数据验证的实现

    前言 小明最近又遇到麻烦了,小红希望对接接口传送的数据进行验证,既然是小红要求,那小明说什么都得满足呀,这还不简单嘛。 传统验证 [HttpPost] public
    2020-11-19
  • .NET Core使用Topshelf方式创建Windows服务的全过程记录

    .NET Core使用Topshelf方式创建Windows服务的全过程记录

    前言 Topshelf是一个.NET Standard库,它消除了在.NET Framework和.NET Core中创建Windows服务的那些麻烦。 安装 Install-Package Topshelf 代码 using Syste
    2020-11-19
  • ASP.NET Core3.1 Ocelot认证的实现

    ASP.NET Core3.1 Ocelot认证的实现

    1.认证 当客户端通过Ocelot访问下游服务的时候,为了保护下游资源服务器会进行认证鉴权,这时候需要在Ocelot添加认证服务。添加认证服务后,随后Ocelot会基于授权密
    2020-11-19
  • .NET Core使用FluentEmail发送邮件的示例代码

    .NET Core使用FluentEmail发送邮件的示例代码

    前言 在实际的项目开发中,我们会遇到许多需要通过程序发送邮件的场景,比如异常报警、消息、进度通知等等。一般情况下我们使用原生的SmtpClient类库居多,它能满足
    2020-11-19

最新评论