ASP.Net 微信H5 OAuth2 认证 (前后端不分离)


在19年出开始接触微信的开发,OAuth认证是我遇到的第一个难题。边学习边记录

首先在微信公众平台配置网页授权域名

 

 

 

需要用到的DLL

Senparc.Weixin.dll

Senparc.Weixin.MP.dll

Senparc.Weixin.WxOpen.dll

 

首先创建一个身份认证的特性 放在所有Controller里面

 

OAuth2AuthorizeAttribute.cs  代码如下

public class OAuth2AuthorizeAttribute : AuthorizeAttribute
    {
        /// <summary>
        /// 验证是否已存用户的wxopenid
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnAuthorization(AuthorizationContext filterContext)
        {

            try
            {
                var request = filterContext.HttpContext.Request;//获取http请求
                
                var req = filterContext.HttpContext.Request.RawUrl.ToString();//拿到完整url

var d = HttpContext.Current.Request.Url.ToString();//这个也是拿到完整的url 只不过这个可以拿到路由里面的参数 上面则不可以 Common.Logs._StrUrl = d;//存到一个常量里面 //判断cookie里面有没有存这个用户的wxopenid if (string.IsNullOrWhiteSpace(TUser.GetUserOpenId())) { //如果cookie里面没有用户的wxopenid则重定向 filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "OAuth2", action = "index", strurl = Common.Logs._StrUrl, })); } } catch (Exception ex) { } } }

 

TUser.cs 

 public static class TUser
    {
        #region 变量区域

        #region Cookie Keys
        /// <summary>
        /// UserPwd Cookie Key
        /// </summary>
        public static string UserOpenIdKey = "577355724964";

        /// <summary>
        /// ValueExt
        /// </summary>
        public static string ValueExt = "_isoks";


        /// <summary>
        /// CookieName
        /// </summary>
        public static string CookieName = "596f727a696b752e576562";


        #endregion

        #endregion

        #region+GetUserOpenId 获取UserOpenId

        public static string GetUserOpenId()
        {
            try
            {
                var cookie = GetCookie();
                if (cookie == null) return string.Empty;
                var userOpenId = cookie.Values[UserOpenIdKey];
                return userOpenId;
            }
            catch
            {
                return string.Empty;
            }
            return string.Empty;
        }

        #endregion

        #region +SetCookie 设置登录的cookie
        /// <summary>
        /// 设置登录的cookie
        /// </summary>
        /// <param name="id">id</param>
        /// <param name="name">用户名</param>
        public static void SetUserOpenId(string userOpenId)
        {
            var cookie = new HttpCookie(CookieName) { HttpOnly = true };
            cookie.Values.Add(UserOpenIdKey, userOpenId);
            //cookie.Expires = DateTime.Now.AddDays(30);
            HttpContext.Current.Response.SetCookie(cookie);
        }
        #endregion

        #region +GetCookie 获取Cookie实例 
        /// <summary>
        /// 获取Cookie实例
        /// </summary>
        /// <returns></returns>
        public static HttpCookie GetCookie()
        {
            try
            {
                var key = CookieName;
                var cookie = HttpContext.Current.Request.Cookies[key];
                return cookie;
            }
            catch
            {
                return null;
            }
        }
        #endregion

    }

 

 

OAuth2Controller 代码 

 /// <summary>
    /// 调用微信API换取WXOpenid
    /// </summary>
    public class OAuth2Controller : BaseController
    {
        /// <summary>
        /// 定义一个常量用来存储需要请求的路径
        /// </summary>
        public static string PrevUrl = string.Empty;
        public ActionResult Index(string strurl = "")
        {
            //给常量赋值
            PrevUrl = strurl;
            //调用微信API接口 BAPPID=公众号的APPID  BREDIRECTURL=接收微信返回结果的路由 例:http://localhost/OAuth2/RedirectUrl
            var uri = OAuthApi.GetAuthorizeUrl(BAPPID, BREDIRECTURL, "0", OAuthScope.snsapi_userinfo);
            //重定向访问微信授权地址
            return Redirect(uri);
        }

        /// <summary>
        /// 微信OAuthApi回调
        /// </summary>
        /// <param name="code">状态码</param>
        /// <param name="state"></param>
        /// <returns></returns>
        public ActionResult RedirectUrl(string code, string state)
        {
            try
            {
                //判断状态码是否为空
                if (string.IsNullOrEmpty(code))
                {
                    return Json(new { State = false, Msg = "哎呀,出错了!" });
                }
              
                //定义一个接收Tokoen的result
                OAuthAccessTokenResult result = null;
                try
                {
                    result = OAuthApi.GetAccessToken(BAPPID, BSECRET, code);
                }
                catch (Exception ex)
                {
                    return Json(new { State = false, Msg = "哎呀,出错了!" });
                }
                if (result.errcode != ReturnCode.请求成功)
                {
                    return Json(new { State = false, Msg = "哎呀,出错了!" });
                }


                //拿到token以后调用微信接口 用token和openid换去用户信息
                var userinfo = OAuthApi.GetUserInfo(result.access_token, result.openid);
                //拿到用户信息后创建或修改自己项目中的用户表
                if (userinfo != null)
                {
                    var user = UserRepository.GetUserByWxOpenId(result.openid);
                    if (user != null)
                    {
                        user.NickName = userinfo.nickname;
                        user.HeadImg = userinfo.headimgurl;
                        user.UserSex = (UserSex)Enum.Parse(typeof(UserSex), userinfo.sex.ToString());
                        UserRepository.SaveOrUpdate(user);
                    }
                    else
                    {
                        //create user
                        User guser = new User();
                        guser.WxOpenId = result.openid;
                        guser.HeadImg = userinfo.headimgurl;
                        guser.NickName = userinfo.nickname;
                        guser.State = true;
                        guser.UserSex = (UserSex)Enum.Parse(typeof(UserSex), userinfo.sex.ToString());
                        guser.AddTime = DateTime.Now;
                        guser.UserType = UserType.游客;
                        guser.GuId = Guid.NewGuid().ToString();
                        UserRepository.SaveOrUpdate(guser);
                    }
                }
                //将用户的openid存起来
                TUser.SetUserOpenId(result.openid);
                //跳转程序原来要跳转的路由
                if (IsoksIsNullOrWhiteSpace(PrevUrl))
                {
                    return Redirect(PrevUrl);
                }
                return Redirect("~/home/index");
            }
            catch (Exception ex)
            {
                log(ex.Message, "出错啦");
            }
            return Error500cshtml();
        }
    }

 

 

总体思路:客户端发来请求,通过过滤器拿到要请求的路径,判断cookie里面有没有存当前用户的wxopenid,如果存了直接跳转正常要请求的路径,如果wxopenid为空 则重定向到OAuth2Controll 根据配置的APPID和BREDIRECTURL=重定向url跟微信API进行交互获取用户的微信信息进行创建或更新用户并在cookie里面存储用户信息

 

文章来源:https://www.cnblogs.com/kangsir7/p/15741437.html

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
管理员
上一篇:(原创)WinForm中莫名其妙的小BUG——RichTextBox自动选择字词问题
下一篇:.net 简单实现在H5中将word、jpg、png转成PDF给PDF添加水印并且控制样式和可视化编辑
评论列表

发表评论

评论内容
昵称:
验证码:
验证码
关联文章

ASP.Net H5 OAuth2 认证前后分离
Asp.net H5唤起支付和支付回调
有限在线用户的场景中,前后分离是多此一举
支付:签名计算.net4.5
asp.net core 支持多种身份认证方式
2.客户与服务连接
支付宝:H5 JSAPI支付开发手册
授权连接URL生成类库
支付提示 No_Auth 受理关系存在
H5页面开发禁用webview内嵌的h5缩放啊?
.net 简单实现在H5中将word、jpg、png转成PDF给PDF添加水印并且控制样式和可视化编辑
.NET Core中的鉴权授权正确方式(.NET5)
支付:JSAPI支付 开发手册
支付:C#计算签名
【已解决】.NET 支付API V3中JSAPI支付发起wx.chooseWXPay时,提示 支付验证签名失败
如何在 .NET Core ASP.NET中中指定口号启动:最佳实践与动态配置
支付,当面付,开发手册
ASP.NET MVC快速入门(一)
支付:header中的mchid与post payload中的mchid匹配
支付:JSAPI支付失败 报错:登录失败, redirect_uri域名与后台配置一致,错误码:10003

热门标签
.NET Core .NET Reactor ag-grid AI发布 api安全 ASP.NET Core C#DLL加密 C#播放声音 C#代码混淆 C#代码加密 ChromeDriver Codex DateTime DBeaver devexpress devTool DLL混淆 edge.js EF EFCore Electron element-ui el-form el-table excel FastReport FileStream FolderBrowerDialog FolderSelectDialog form提交 git gridcontrol gridview input javascript json字符串 JS转换对象JSON jwt JWT授权 linq log Math MCP mitmproxy MVC MySQL Navicat netstat nginx node_modules NSwag Nuget Nuget镜像 number PowerShell pyinstaller python pythoncom python爬虫 python抓包 pywin32 redis Requests-html RestSharp Selenium sql SQL Server Swagger to-cms Visual Studio VSCode vue VueRouter vue路由 VUE页面通讯 Webpack Windows Windows服务 winform wmi xlrd yaml YESCMS YESWEB开发框架 白象 表单提交 播放声音 打开URL 代码混淆 弹窗提醒 端口占用 对象转换 分布式 公共字典 机器码 进程排查 静态资源 开发指南 路由参数 密钥 配置教程 配置文件 权限 人工智能 任务 任务调度 日期间隔 日志 日志记录 省市区 授权验证 数据库 四舍五入 文案 文件读取 文件夹选择 文件目录选择 问题排查 行政区域数据 页面通讯 中间件 CSharp 事务锁 工单系统 并发控制 重复提交 CMS Markdig Markdown markdown-it marked 技术选型 VS Code 开发工具 源代码管理 版本控制 Docker PostgreSQL 时区 部署排查 CMS架构 EF Core 主题系统 二次开发 插件系统 容器 运维命令 镜像清理 Linux NAS 远程挂载 飞牛 fnOS
联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码