前段时间随意抽离了一部分代码作为OAuth2的示例代码,若干处会造成困扰,现说明如下:

 1 public class OAuthController : Controller
 2     {
 3         private static string _authorizeUrl = ConfigurationManager.AppSettings["AuthorizeUrl"];
 4         private static string[] _queryParameters = new string[] { "client_id", "redirect_uri", "state", "response_type", "scope" };
 5         private readonly AuthorizationServer _authorizationServer = new AuthorizationServer(new OAuth2AuthorizationServer());
 6
 7         [AcceptVerbs(HttpVerbs.Get)]
 8         public ActionResult Authorize(string userkey)
 9         {
10             var pendingRequest = this._authorizationServer.ReadAuthorizationRequest(Request);
11             if (pendingRequest == null)
12             {
13                 throw new HttpException((int)HttpStatusCode.BadRequest, "Missing authorization request.");
14             }
15
16             if (string.IsNullOrEmpty(userkey))
17             {
18                 string url = _authorizeUrl, callback = Request.Url.GetLeftPart(UriPartial.Path);
19                 StringBuilder querystring = new StringBuilder(string.Format("client_id={0}&", HttpUtility.UrlEncode(this.Request.QueryString["client_id"]))), callbackQuery = new StringBuilder();
20                 foreach (string key in this.Request.QueryString.Keys)
21                 {
22                     if (!_queryParameters.Contains(key))
23                         querystring.Append(string.Format("{0}={1}&", key, HttpUtility.UrlEncode(this.Request.QueryString[key])));
24                     else
25                         callbackQuery.Append(string.Format("{0}={1}&", key, HttpUtility.UrlEncode(this.Request.QueryString[key])));
26                 }
27                 if (callbackQuery.Length > 0)
28                 {
29                     callback += ("?" + callbackQuery.ToString().TrimEnd('&'));
30                     querystring.Append(string.Format("callback={0}&", HttpUtility.UrlEncode(callback)));
31                 }
32                 if (querystring.Length > 0)
33                 {
34                     url += ("?" + querystring.ToString().TrimEnd('&'));
35                 }
36                 return Redirect(url);
37             }
38             else
39             {
40                 using (var db = new OAuthDbContext())
41                 {
42                     var client = db.Clients.FirstOrDefault(o => o.ClientIdentifier == pendingRequest.ClientIdentifier);
43                     if (client == null)
44                         throw new AuthorizeException("40143", "不受信任的商户");
45                     else
46                     {
47                         var user = DESCrypt.Decrypt(userkey, client.ClientSecret);
48                         var approval = this._authorizationServer.PrepareApproveAuthorizationRequest(pendingRequest, user);
49                         var response = this._authorizationServer.Channel.PrepareResponse(approval);
50                         return response.AsActionResult();
51                     }
52                 }
53             }
54         }
55
56         public ActionResult Index()
57         {
58             ViewBag.Body = "Welcome To OAuth2.0";
59             return View();
60         }
61     }

这是授权服务端的主要代码。AuthorizeUrl和userkey分别表示什么意思?

这里涉及到我所在公司的具体情况,简单地说,用户授权的具体逻辑是由另外单独的站点(AuthorizeUrl表示,为方便描述,称为A站点)引导,所以这里的代码主要起到一个跳转的作用。我们看DotNetOpenAuth的官方Demo,会发现授权服务端有登录页面、授权页面等等,其实本质是一样的,只是拆分成两个站点。除了OAuth参数,此处可能会传递其它参数,所以使用_queryParameters来区分,并分别构建两部分查询字符串,OAuth参数会附加到callback地址参数上,用户授权后会从A站点跳回该地址(此处就是该action所表示的地址),然后返回浏览器授权码。

关于userkey,大家看到有个解密的步骤(第47行),so,这肯定是考虑到安全问题。公司的业务逻辑大多采用userid标示用户,为自增长int类型,用户通过A站点授权后通过浏览器callback时,userid可以在地址栏中被捕捉到,假如复制该地址并随意更改userid值,就很有可能在对应用户未授权的情况下获得其访问权限。所以我们不允许直接传递userid,而是经过一层对称加密,这就是userkey的由来。如果授权逻辑并未拆分成独立站点,那么就不存在这种情况了。

后续我可能会再补充若干内容,由于工作较忙,只对有朋友提出疑问的地方做一说明;若有其它问题,请告知,我会不定期更新。

转载于:https://www.cnblogs.com/newton/p/3680154.html

使用DotNetOpenAuth搭建OAuth2.0授权框架——Demo代码简单说明相关推荐

  1. 【转】C#搭建Oauth2.0认证流程以及代码示例

    对于一个普遍问题,必有对应的一个简洁优美的解决方案.这也许只是一厢情愿,因为根据宇宙法则,所有事物总归趋于混沌,而OAuth协议就是混沌中的产物,不管是1.0.1.0a还是2.0,单看版本号就让人神伤 ...

  2. OAuth2.0授权协议的一个简单解释

    本文来简单说下OAuth 2.0授权协议 文章目录 概述 快递员问题 授权机制的设计 互联网场景 令牌与密码 本文小结 概述 OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数 ...

  3. php对接AliGenie天猫精灵服务器控制智能硬件esp8266② 全面认识第三方授权机制 oauth2.0 协议,如何在 php 上搭建 oauth2.0服务端!(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. php对接AliGenie天猫精灵服务器控制智能硬件esp82 ...

  4. 使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

  5. 新浪微博Oauth2.0授权认证及SDK、API的使用(Android)

    ---------------------------------------------------------------------------------------------- [版权申明 ...

  6. oauth2.0授权码模式详解

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  7. 微信公众平台OAuth2.0授权

    2019独角兽企业重金招聘Python工程师标准>>> 微信公众平台OAuth2.0授权详细步骤如下: 1. 用户关注微信公众账号. 2. 微信公众账号提供用户请求授权页面URL. ...

  8. 微信企业号OAuth2.0授权-Java

    为什么80%的码农都做不了架构师?>>>    我也是醉了,中午做个饭这么难吃!连自己都看不下去了!怀着沉重的心情把微信企业号OAuth2.0授权看了看,感觉与公众号差别没什么,相信 ...

  9. java 32位授权码_Java实现OAuth2.0授权码方式

    Java实现OAuth2.0授权码方式 前面介绍了OAuth2.0和授权方式,可以参考以下文章: 今天就用Java来验证OAuth2.0授权方式的授权码式,我们Spring Cloud的OAuth来实 ...

  10. OAuth2.0授权码模式学习

    OAuth2.0授权码模式学习 四种授权方式 1,授权码模式 2,简化模式 3,密码模式 4,客户端模式 授权码模式 四种授权模式中最完成,最严密的授权. (1)用户访问客户端,后者将前者导入认证服务 ...

最新文章

  1. JDK, JRE 和JVM的区别
  2. 批量恢复文件的Py脚本
  3. linux 线程池编程,Linux-C-9-线程池编程
  4. Java基础 -- 冒泡排序算法(带详细注释)
  5. ubuntu,win10 释放IP,重新获取IP
  6. 更高速 更智能 WLAN领域H3C再获领先——H3C发布新一代高性能802.11n 无线产品
  7. Android 内存监测工具 DDMS -- Heap
  8. MySQL高可用之PXC详解
  9. SpringSocial 开发 QQ 登录
  10. 设计模式笔记——代理模式
  11. 第7周编程题在线测试
  12. 网络拥塞控制,对越远的流量越宽容
  13. C++基础知识(上)
  14. 静态时序分析—串扰延迟分析(Crosstalk Delay Analysis)
  15. 容联云通讯完成发送验证码
  16. 计算机 开机硬盘灯一直亮,电脑一开机硬盘灯就一直亮
  17. cad自动填写页码lisp,CAD 中 如何自动添加页码?
  18. iptables目标TTL
  19. 联发科AI解决方案芯片i700规格参数介绍
  20. Ubuntu18.04环境下I219-LM网卡不能识别问题解决

热门文章

  1. python卷积函数_Convolution卷积算法python以numpy,Matplotlib实现
  2. 数据库与表的操作之重命名、删除表
  3. Spring AOP(三)之AfterThrowing增强处理
  4. 【渝粤教育】国家开放大学2018年春季 0032-22T农业经济学 参考试题
  5. 【渝粤教育】国家开放大学2019年春季 0692-22T化工设备机械基础 参考试题
  6. 【渝粤教育】广东开放大学 形成性考核 (29)
  7. TensorFlow2.0学习使用笔记
  8. 三台服务器的时间同步-Linux
  9. Linux学习日志--共享内存
  10. salesforce 零基础学习(六十八)http callout test class写法